home *** CD-ROM | disk | FTP | other *** search
- ⓪ (* --------------------------------------------------------------⓪#Modula Compiler /4.0 / fuer Atari ST / 68020 + 68881 V#0325⓪#--------------------------------------------------------------⓪ ⓪#File mc8: Assembler (Th. Tempelmann)⓪ ⓪#15.9.85 Labels auch ohne '!' erlaubt.⓪#16.9.85 DBcc jetzt auch bei Vorwaertsref. mit D0 bis D7 moeglich.⓪#16.9.85 Fehlermeldung bei 'ADD.X <ea>,An' eingebaut.⓪#17.9.85 Fehler bei Adr.-Art 'd8(PC,Rn.X)' behoben.⓪#18.8.85 MOVEM nun fast fehlerfrei.⓪#19.8.85 Fehlender,aber erwarteter 2. Operand wird angemeckert⓪#19.8.85 Befehle DBRA,ILLEGAL und BREAK(wie ILLEGAL) implementiert⓪#20.09.85 - 25.09.85 :⓪&- Bei AERR6 wird ID-Name ausgegeben ( z.Zt. auf Screen ).⓪&- MOVEM fehlerfrei, sowie BTST #d3,<ea>⓪&- Bei $D+ wird die Default-Size fuer Bcc auf Long gesetzt (sonst:Short).⓪&- Neue Vorwaertsref.-Verkettung bei Labels -> ERROR 208 tritt nie mehr⓪)auf !⓪&- Vorw.-ref. auf Labels nun auch mit d16(PC) und d8(PC,Rn.X) moeglich.⓪&- die Adressierungsarten PC-Relativ und SSP ausgebaut.⓪&- die Adressierungsart d16 (Absolut,nur 16 Bit) wird nicht mehr⓪)verwandt ( LEA $400,A0 erzeugt 3 Worte ! ).⓪&- Typenpruefung bei Zugriffen auf Symbole mit Fehlermeldung ( ERROR⓪)Nr. 213 ).⓪&- Neben Konstanten koennen auch RECORDs sowie Elemente aus Aufz.-Typen⓪)verwandt werden.⓪&- Am Ende eines Assembler-Teils kann nun direkt ein Label stehen,⓪)also z.B. ' EndLabel END '.⓪&- Bei 'Bcc' auf ein schon bekanntes Label wird nicht mehr standard-⓪)maessig 'Short' als Size verwandt, sondern immer die optimale⓪)Size genommen, wenn der Branch-Befehl keine explizite Size⓪)Angabe enthaelt.⓪'- Bei Mnemonics, die nach dem TEWI 68000-Buch keiner Size-Angabe⓪)beduerfen, wird bei einer Sizeangabe ein Fehler gemeldet.⓪)⓪#29.09.85 Automatisches SYNC ausgebaut ( ausser am Ende eines⓪.Assembler-Bereichs ), jedoch Abfrage darauf ueberall, bis auf⓪.bei: DC.B , ASC , ACZ .⓪#29.09.85 ACI ausgebaut.⓪#30.09.85 Fuer A7 ist auch SP zugelassen.⓪#30.09.85 Expressionauswertung (auch Label1-Label2).⓪#30.09.85 Reglist nun auch mit 'Rn-Rm' moeglich.⓪#30.09.85 Records jetzt richtig ansprechbar.⓪#01.10.85 Jetzt hoffentlich ueberall Abfrage, ob Size da oder nicht.⓪#01.10.85 MOVEC VBR implementiert und Fehlermeldung Nr. 215 bei RTE.⓪.Dazu wurde aus dem unbenutzten Symbol 'SSP' 'VBR' gemacht.⓪#07.10.85 68010-Befehle RTD und MOVE from CCR eingefuehrt.⓪#08.10.85 Sizeangaben-Pruefung erfolgt nun nach Motorola's 68000⓪.16-Bit User's Manual. Ausnahmen:⓪.Bei Branch: auch '.S' fuer '.B' und '.L' fuer '.W' .⓪.ORI,EORI,ANDI,MOVE mit SR oder CCR: hier keine Size erlaubt.⓪#08.10.85 Fehler bei lok. Proc. behoben.⓪#08.10.85 Unterscheidung in Long- und Word/Byte-Konstanten eingefuehrt.⓪.Nun sind L-Const. bei 'd32', LEA,JMP,JSR,PEA erlaubt.⓪.Ausserdem wird am Ende von 'GetExpr' nochmal die Groesse⓪.des Datums in der Var. 'Data' ueberprueft.⓪#08.10.85 Data-Size-Abpruefung bei LINK und STOP/RTD verbessert.⓪#08.10.85 DS - Pseudo-Op implementiert.⓪#10.10.85 Sizeangaben-Pruefung nochmal veraendert (jetzt wie Motorola's⓪.680XX - User's Manual:⓪0Bei MOVE CCR oder MOVE SR ist auch '.W' erlaubt.⓪0Bei ANDI to SR, EORI to SR, ORI to SR ist '.W' erlaubt.⓪0Bei ANDI to CCR, EORI to CCR, ORI to CCR ist '.B' erlaubt.⓪#10.10.85 Range-Test ueberarbeitet und ERROR 216 eingefuehrt.⓪#11.10.85 Bei Records auch POINTER TO RECORD oder ARRAY OF RECORD moeglich.⓪#12.10.85 LEA / PEA mit allen Adr. erlaubt.⓪#13.10.85 Error 211 bei 'Bcc.S' mit Offset = Null wieder eingebaut.⓪#15.10.85 als Expr auch Typen ( RECORD, POINTER und ARRAY ) erlaubt.⓪#16.10.85 Fehler bei TRAP - Befehlsuebersetzung behoben⓪#16.10.85 'Testtype' nun in 'MN's mit direkter Angabe, ob Source⓪.oder Destination geprueft wird.⓪#17.10.85 Fehler vom 16.10.85 bei LSL, ROR usw. behoben.⓪#29.01.86 Labels auf ungeraden Adr. zugelassen;⓪-Fehler bei vorw. Ref. auf Label, das direkt hinter END steht,⓪-behoben;⓪-Fehlerhafte Uebersetzung von LSR <ea> usw. behoben.⓪#22.02.86 Neuordnung der Texte (jm)⓪#21.03.86 LINK - Inst. nun richtig ( vorher wurde immer LINK ..,#0 erzeugt)⓪#30.07.86 V3.3a: 68020-Mnemonics impl., zudem STR-Pseudo-Op, um Strings mit⓪-Längenzähler anzulegen. Neue Option: 'X+' für 68020-Befehle;⓪-Test_Ind_An: auch auf SP abgefr., somit nun auch (SP) als Adr.-Art⓪-zugelassen; BRA mit LONG-Offset sind nicht erzeugbar, da da ja nur⓪-in Prozeduren ginge, und die können sowieso nicht größer als 64KB⓪-werden. ApndD0_W/L legen Code nun direkt ab. Dadurch sind D2 u. D3⓪-jetzt während der Code-Erzeugung frei.; ASC mit ',' trennbar;⓪-DIVSL u. DIVUL nicht übersetzt, da Codierung unklar; für parameter-⓪-lose TRAPcc muß als Parameter '()' angegeben werden !; MOVES noch⓪-nicht impl. !; Nach Labeldecl. ist ein direkt angeschlossenes ':'⓪-erlaubt;⓪#08.08.86 STR-Pseudo-Op: Alle folg. Zeichen, auch die mit Komma angehängten,⓪-werden als ein String bewertet; GENSTR um Auswertung von Chars⓪-und Charconsts erweitert, Auswertung von Strconsts geht noch nicht⓪#23.11.86 Aenderungen aus V3.3b uebernommen (BYTE->BITE, alle IDs>AsmFirst⓪-um 2 erhoeht, kein Fehler bei RTE bei Atari, ConFact statt⓪-ConstEx.⓪-Achtung: Es ist nicht sicher, ob CAAR und CACR richtig gehen !⓪6Es sollte mal gepr}ft werden !⓪#02.12.86 Kein Fehler mehr bei DC.L a,b,c,... (pInstr bei PseudoOp angepasst)⓪#17.12.86 (ch) Einbau der 68881 - Befehle⓪#11. 1.87 (jm) Aenderung bei NumDat; Kommentare bei '%%%%'⓪#15. 1.87 (jm) bei MOVEQ wieder Argumente -128 <= x <= 255 zugelassen⓪#16. 1.87 (jm) TstScale, GADR11 aus Conditional-Clause gezogen⓪2(Fehler im Atari-Mode)⓪$2. 3.87 GetEA: SR->CCR⓪#27.02.87 Redefinition v. lokalen Labels möglich; Flag f. Labels, ob auf⓪-sie referiert wird; X-Option wird pro Mnemonic gesamt verwendet⓪#03.03.87 Ausklammerung aller 68020/881-Routinen f. Atari⓪#25.03.87 (jm) 68020-Korrekturen von CH (unbek. Datum) wieder eingebaut⓪#12.04.87 AsmWarning impl.; Warning bei ill. Zugriffen auf A3 bei Gepard⓪#20.04.87 Conditionals für 68020/881-Übersetzung (Asm20)⓪#28.04.87 Fehler in GetEA behoben (Asm-Symbols wurden mit .B geprüft)⓪#08.05.87 '* )' in AsmError und AsmWarning entfernt⓪#22.05.87 Wegen Fehler im Boot-ROM erfolgt bei MOVE from CCR eine⓪-Fehlermeldung.⓪#18.07.87 EAto0_5: d16(An) wird zu (An) optimiert, wenn d16 eine⓪-Nullkonst. ist.⓪#06.02.88 EAto0_5: d16(An) wird nur zu (An) optimiert, wenn d16 keine⓪-ausgeschriebene Null/Const⓪#01.01.89 (TT 18.08.88) Neben pTxtLin wird auch TxtLine gerettet⓪#24.07.89 Bisher erkannte CalcExpr einige rel.-Adr-Überlaufe nicht:⓪0z.B. MOVE +/-x(PC,D0.W) oder MOVE +/-y(PC), wenn⓪0256>x>127, 65536>y>32767.⓪#10.12.89 Änderungen für separierten Compiler:⓪-BothSbl: as45, as46, as96 heissen SymAnd, SymOr, SymNot ⓪-LocalSearch statt MySrc⓪#13.12.89 Nachtrag aus TTs Version vom 31.08.89⓪0Symbol-Table: 2. 'DBRA' durch '@@DB' ersetzt, damit RTR geht.⓪#31.12.89 Den ConFact-Aufruf für die Parameter-Konsts durch 'ConstExpr'⓪-ersetzt⓪#29.01.90 Bei '-' Zeichen wird gleich ConstExpr aufgerufen, sodaß z.B.⓪-nicht mehr "-enumValue" geht (dann muß "0-..." progr. werden).⓪#11.02.90 JMP/JSR können auch auf Vars erfolgen⓪#11.03.90 BTST Dn,#x wird zugelassen⓪#16.06.90 MOVE from CCR zugelassen⓪#18.08.90 Anpassung des Offsets zum lok. Record-Baum⓪#10.10.90 Für 68881/2 wird nun auch "#" bei k-Faktor zugelassen (allerdings⓪-auch bei Bitfields)⓪#11.11.90 Symbol FP steht für das Frame-Ptr-Reg ("MM2Comp.VarReg")⓪#05.12.90 MOVEC SFC/DFC nun auch benutzbar⓪#--------------------------------------------------------------------------⓪ *)⓪ ⓪ (* Kommentierung:⓪#Bei Bezug auf MNEMONICs wird ihnen ein '%' direkt vorangestellt,⓪#z.B. '%RTE'. (TT)⓪#Procedurenamen mit '@' sind lokale Hilfsroutinen,die nur von den⓪#direkt folgenden Procedures benutzt werden sollen !⓪ *)⓪ ⓪ TYPE BITE = WORD;⓪ ⓪ CONST NoOperands = 0;⓪(NoOperandsWZE = 1;⓪(DefltSiz = 2; (* Nie aendern, weil dieser Wert sowieso festliegt *)⓪(LabelID = $801D;⓪)⓪)AS1 = 14;⓪)AS2 = 26;⓪)AS3 = 2;⓪)AS4 = 3;⓪)AS5 = 5; (* / *)⓪)AS6 = 4;⓪)AS7 = 23;⓪)AS8 = 24;⓪)AS9 = 47;⓪)(* !! alle Symbols rel. zu FirstAsmSbl bestimmen !! *)⓪)AS10 = FirstAsmSbl; (* 93 *)⓪)AS17 = 100;⓪)AS18 = 101;⓪)AS25 = 108; (* D7 *)⓪)AS26 = 109; (* SP *)⓪)AS_FP = 110; (* FP *)⓪)AS28 = 111;⓪)AS29 = 112;⓪)AS30 = 113;⓪)AS31 = 114;⓪)AS32 = 115;⓪)AS35 = 116;⓪)AS36 = 117;⓪)AS37 = 9;⓪)AS38 = 10;⓪)AS39 = 30;⓪)⓪)AS40 = 119; (* %ABCD *)⓪)AS_MneF = AS40;⓪)AS_MneL = 240; (* %RTD *)⓪)⓪)AS157 = 241; (* %DC *)⓪)AS158 = 242; (* %DS *)⓪)AS159 = 243; (* %@11 *)⓪)AS160 = 244; (* %EQU *)⓪)AS161 = 245; (* %ACZ *)⓪)AS162 = 246; (* %SYNC *)⓪)AS163 = 247; (* %ACS *)⓪)AS164 = 248; (* %ACI *)⓪)AS165 = 249; (* %BOMB *)⓪)⓪)(* neue Konstante seit 3.3a (68020) *)⓪)⓪)AS_Astrx = 4; (* "*" *)⓪)AS_eKlA = 15;⓪)AS_eKlZ = 27;⓪)AS_gKlA = 16;⓪)AS_gKlZ = 28;⓪)AS_dPnkt = 25;⓪)⓪)AS_STR = 250;⓪)AS_SFC = 251;⓪)AS_DFC = 252;⓪)AS_CACR = 253;⓪)⓪)(* 254 und 255 müssen frei bleiben !!! (STRCONST und NUMCONST) *)⓪)⓪)AS_CAAR = 257;⓪)AS_MSP = 258;⓪)AS_ISP = 259;⓪)AS_M20F = 260;⓪)AS_M20L = AS_M20F + 36 (* 41 *) + 171 (* Anzahl der 68881-Mnes *);⓪)AS_FP0 = AS_M20L + 1; (* 68881 - Register *)⓪)AS_FP7 = AS_FP0 + 7;⓪)AS_FPCR = AS_FP7 + 1;⓪)AS_FPSR = AS_FPCR + 1;⓪)AS_FPIAR = AS_FPSR + 1;⓪)⓪ VAR⓪ ⓪ MneSecCode : WORD;⓪ MneCode : WORD;⓪ MneVec : ADDRESS;⓪ DefltBcc : BITE;⓪ SizeOfData : BITE;⓪ Args : BITE;⓪ BreakAgain : BITE;⓪ (*$ ? RunGep:⓪ AsmOptions : LONG;⓪ pInstr : LONG; *)⓪ (*$ ? RunST:⓪ AsmOptions : LONGWORD;⓪ pInstr : LONGWORD; *)⓪ ⓪ ⓪ ModeSource:BITE;⓪ Mode2Source:BITE;⓪ RegSource:BITE;⓪ Reg2Source:BITE;⓪ DataTypeSource:WORD;⓪ DataTypeOdSource:WORD;⓪ IndRegSource:BITE;⓪ IndTypeSource:BITE;⓪ IndSizeSource:BITE;⓪ RegListSource:WORD;⓪ DataSource:ADDRESS;⓪ Data2Source:ADDRESS;⓪ IDPtrSource:ADDRESS;⓪ M20FlgSource:BITE;⓪ DataOdSource: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ;⓪ IndScaleSource:BITE;⓪ FormatSource:BITE;⓪ BitWidthSource:BITE;⓪ BitOffsSource:BITE;⓪ ⓪ ModeDest:BITE;⓪ Mode2Dest:BITE;⓪ RegDest:BITE;⓪ Reg2Dest:BITE;⓪ DataTypeDest:WORD;⓪ DataTypeOdDest:WORD;⓪ IndRegDest:BITE;⓪ IndTypeDest:BITE;⓪ IndSizeDest:BITE;⓪ RegListDest:WORD;⓪ DataDest:ADDRESS;⓪ Data2Dest:ADDRESS;⓪ IDPtrDest:ADDRESS;⓪ M20FlgDest:BITE;⓪ DataOdDest: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ;⓪ IndScaleDest:BITE;⓪ FormatDest:BITE;⓪ BitWidthDest:BITE;⓪ BitOffsDest:BITE;⓪ ⓪ ModeThird:BITE;⓪ Mode2Third:BITE;⓪ RegThird:BITE;⓪ Reg2Third:BITE;⓪ DataTypeThird:WORD;⓪ DataTypeOdThird:WORD;⓪ IndRegThird:BITE;⓪ IndTypeThird:BITE;⓪ IndSizeThird:BITE;⓪ RegListThird:WORD;⓪ DataThird:ADDRESS;⓪ Data2Third:ADDRESS;⓪ IDPtrThird:ADDRESS;⓪ M20FlgThird:BITE;⓪ DataOdThird: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ;⓪ IndScaleThird:BITE;⓪ FormatThird:BITE;⓪ BitWidthThird:BITE;⓪ BitOffsThird:BITE;⓪ ⓪ ⓪ Mode:BITE; (* Beschreibt Adr.-Art:⓪2Wert der Bits 0-5:⓪40 : keine Adressierung⓪41 : Dn⓪42 : An⓪43 : (An)⓪44 : (An)+⓪45 : -(An)⓪46 : d16(An)⓪47 : d8(An,Xn) / auch Erw. Adr.Arten bei 68020⓪48 : unbenutzt (war mal d16)⓪49 : d32⓪410 : d16(PC)⓪411 : d8(PC,Xn) / auch Erw. Adr.Arten bei 68020 mit PC⓪412 : #data⓪413 : SR⓪414 : USP⓪415 : CCR⓪416 : VBR⓪417 : (Dn)⓪418 : Xn - reglist⓪419 : SFC⓪420 : DFC⓪421 : CACR⓪422 : CAAR⓪423 : MSP⓪424 : ISP⓪4(* 68881 - Modi *)⓪425 : FPn⓪426 : FPn - reglist⓪427 : FPCR(reg=2), FPSR(reg=1), FPIAR(req=0)⓪428 : FStatus - reglist⓪429 : <ea>{Di} (ea-Type in Mode2, i in Format)⓪430 : <ea>{#i} (ea-Type in Mode2, i in Format)⓪4⓪2Bit 7 gesetzt: Doppelregister⓪2Bit 6 gesetzt: BitField folgt EA *)⓪ Mode2:BITE; (* Adr.-Art f. zweites Register bei Doppelregs, sonst undef. *)⓪ Reg:BITE; (* Registernummer *)⓪ Reg2:BITE; (* evtl. zweite Registernummer bei 68020 (Doppelregister) *)⓪ DataType:WORD; (* bit 15 : 1=Wert noch unbekannt,⓪2bit 14 : ID = TYPE (z.B. TYPE einer RECORD-Def.),⓪2bit0-12: Type des Operanden:⓪40 : Short CONST (Byte/Word) : Konstante⓪41 : External Var. : Konstante⓪42 : Num. Konstante : Konstante⓪43 : einzelner Character : Konstante⓪44 : Aufzählungstyp : Konstante⓪45 : Record-Feld Variable : Konstante⓪46 : glob. Var., Table : abs. Pointer⓪47 : glob. Procedure : abs. Pointer⓪48 : lok. Label : rel. Pointer⓪49 : lok. Var. : Konstante⓪410 : lok. Procedure : rel. Pointer⓪411 : Long CONST : Konstante⓪412 : Real CONST : Konstante *)⓪ DataTypeOd:WORD; (* wie oben, für od *)⓪ IndReg:BITE; (* Indexregister Nummer *)⓪ IndType:BITE; (* Indexregister Type ($FF=Dn/0=An) *)⓪ IndSize:BITE; (* Indexregister Size (.W/.L) *)⓪ RegList:WORD; (* fuer MOVEM *)⓪ Data: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ;⓪"(* evtl. Konstante (z.B. d32 oder bd) *)⓪ Data2: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ;⓪"(* weitere 32 für die Abspeicherrung einer Real Const *)⓪ IDPtr:ADDRESS; (* bei glob. ID-Referenzen: Zeiger auf ID *)⓪ M20Flg:BITE; (* Flags f. erw. Adr.-Art d. 68020 (s. CONST unten) *)⓪ DataOd: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ; (* od bei 68020 *)⓪ IndScale:BITE; (* Scaling-Faktor bei 68020 *)⓪ Format:BITE; (* Format der Packedconversion des 68881 *)⓪ BitWidth:BITE; (* Breite bei Bitfields (bit 5 zeigt Register-Indizierung an) *)⓪ BitOffs:BITE; (* Offset bei Bitfields (bit 5 zeigt Register-Indizierung an) *)⓪ GetLastSbl: BOOLEAN;⓪ ⓪ ⓪ CONST FlgeKlA = 0;⓪&FlgeKlZ = 1;⓪&FlgXn = 2;⓪&FlgAnPC = 3;⓪&FlgOd = 4;⓪&FlgBd = 5;⓪&FlgPreIx= 6;⓪&FlgIs20 = 7; (* markiert Erw. Adr-Art der 68020 '([bd,An/PC],Xn],od)' *)⓪ ⓪ ⓪ PROCEDURE ASMSBL;⓪ BEGIN⓪ ASSEMBLER⓪)ACZ 'A0'⓪)ACZ 'A1'⓪)ACZ 'A2'⓪)ACZ 'A3'⓪)ACZ 'A4'⓪)ACZ 'A5'⓪)ACZ 'A6'⓪)ACZ 'A7'⓪)ACZ 'D0'⓪)ACZ 'D1'⓪)ACZ 'D2'⓪)ACZ 'D3'⓪)ACZ 'D4'⓪)ACZ 'D5'⓪)ACZ 'D6'⓪)ACZ 'D7'⓪)ACZ 'SP'⓪)ACZ 'FP'⓪)ACZ '@2'⓪)ACZ 'SR'⓪)ACZ 'USP'⓪)ACZ 'CCR'⓪)ACZ 'VBR'⓪)ACZ 'PC'⓪)ACZ '@3'⓪)ACZ '@4'⓪)ACZ 'ABCD'⓪)ACZ 'SBCD'⓪)ACZ 'ADDX'⓪)ACZ 'SUBX'⓪)ACZ 'ADD'⓪)ACZ '@5'⓪)ACZ '@6'⓪)ACZ 'SUB'⓪)ACZ 'ADDA'⓪)ACZ 'CMPA'⓪)ACZ 'SUBA'⓪)ACZ 'MOVEA'⓪)ACZ 'ADDI'⓪)ACZ 'CMPI'⓪)ACZ 'SUBI'⓪)ACZ 'ANDI'⓪)ACZ 'EORI'⓪)ACZ 'ORI'⓪)ACZ 'ADDQ'⓪)ACZ 'SUBQ'⓪)ACZ 'ASL'⓪)ACZ 'ASR'⓪)ACZ 'LSL'⓪)ACZ 'LSR'⓪)ACZ 'ROL'⓪)ACZ 'ROR'⓪)ACZ 'ROXL'⓪)ACZ 'ROXR'⓪)ACZ 'BCC'⓪)ACZ 'BCS'⓪)ACZ 'BEQ'⓪)ACZ 'BGE'⓪)ACZ 'BGT'⓪)ACZ 'BHI'⓪)ACZ 'BLE'⓪)ACZ 'BLS'⓪)ACZ 'BLT'⓪)ACZ 'BMI'⓪)ACZ 'BNE'⓪)ACZ 'BPL'⓪)ACZ 'BVC'⓪)ACZ 'BVS'⓪)ACZ 'BRA'⓪)ACZ 'BSR'⓪)ACZ 'BCHG'⓪)ACZ 'BCLR'⓪)ACZ 'BSET'⓪)ACZ 'BTST'⓪)ACZ 'CHK'⓪)ACZ 'MULS'⓪)ACZ 'MULU'⓪)ACZ 'DIVS'⓪)ACZ 'DIVU'⓪)ACZ 'CLR'⓪)ACZ 'NEG'⓪)ACZ 'NEGX'⓪)ACZ '@7'⓪)ACZ 'TST'⓪)ACZ 'CMP'⓪)ACZ 'CMPM'⓪)ACZ 'DBCC'⓪)ACZ 'DBCS'⓪)ACZ 'DBEQ'⓪)ACZ 'DBF'⓪)ACZ 'DBRA'⓪)ACZ 'DBGE'⓪)ACZ 'DBGT'⓪)ACZ 'DBHI'⓪)ACZ 'DBLE'⓪)ACZ 'DBLS'⓪)ACZ 'DBLT'⓪)ACZ 'DBMI'⓪)ACZ 'DBNE'⓪)ACZ 'DBPL'⓪)ACZ 'DBT'⓪)ACZ 'DBVC'⓪)ACZ 'DBVS'⓪)ACZ 'EOR'⓪)ACZ 'EXG'⓪)ACZ 'EXT'⓪)ACZ 'JMP'⓪)ACZ 'JSR'⓪)ACZ 'PEA'⓪)ACZ 'LEA'⓪)ACZ 'LINK'⓪)ACZ 'MOVE'⓪)ACZ 'MOVEM'⓪)ACZ 'MOVEP'⓪)ACZ 'MOVEQ'⓪)ACZ 'NBCD'⓪)ACZ 'SCC'⓪)ACZ 'SCS'⓪)ACZ 'SEQ'⓪)ACZ 'SF'⓪)ACZ 'SGE'⓪)ACZ 'SGT'⓪)ACZ 'SHI'⓪)ACZ 'SLE'⓪)ACZ 'SLS'⓪)ACZ 'SLT'⓪)ACZ 'SMI'⓪)ACZ 'SNE'⓪)ACZ 'SPL'⓪)ACZ 'ST'⓪)ACZ 'SVC'⓪)ACZ 'SVS'⓪)ACZ 'TAS'⓪)ACZ 'NOP'⓪)ACZ 'RTE'⓪)ACZ 'RTS'⓪)ACZ 'TRAPV'⓪)ACZ 'RESET'⓪)ACZ 'STOP'⓪)ACZ 'SWAP'⓪)ACZ 'TRAP'⓪)ACZ 'UNLK'⓪)ACZ 'RTR'⓪)ACZ '@@DB'⓪)ACZ 'ILLEGAL'⓪)ACZ 'BREAK'⓪)ACZ 'MOVEC'⓪)ACZ 'RTD'⓪)ACZ 'DC'⓪)ACZ 'DS'⓪)ACZ '@11'⓪)ACZ 'EQU'⓪)ACZ 'ACZ'⓪)ACZ 'SYNC'⓪)ACZ 'ASC'⓪)ACZ 'ACI'⓪)ACZ 'BOMB'⓪)⓪); neue Symbole seit 30.7.86 (3.3a) f. 68020-Assembler⓪)ACZ 'STR'⓪ (*$ ? Asm20:⓪)ACZ 'SFC'⓪)ACZ 'DFC'⓪)ACZ 'CACR'⓪)ACZ '@01' (* NUMCONST *)⓪)ACZ '@02' (* STRCONST *)⓪)ACZ '@03' (* *)⓪)ACZ 'CAAR'⓪)ACZ 'MSP'⓪)ACZ 'ISP'⓪)ACZ 'BFCHG'⓪)ACZ 'BFCLR'⓪)ACZ 'BFEXTS'⓪)ACZ 'BFEXTU'⓪)ACZ 'BFFFO'⓪)ACZ 'BFINS'⓪)ACZ 'BFSET'⓪)ACZ 'BFTST'⓪)ACZ 'BKPT'⓪)ACZ 'CALLM'⓪)ACZ 'CAS'⓪)ACZ 'CAS2'⓪)ACZ 'CHK2'⓪)ACZ 'CMP2'⓪)ACZ 'DIVSL'⓪)ACZ 'DIVUL'⓪)ACZ 'EXTB'⓪)ACZ 'MOVES'⓪)ACZ 'PACK'⓪)ACZ 'RTM'⓪)ACZ 'TRAPCC'⓪)ACZ 'TRAPCS'⓪)ACZ 'TRAPEQ'⓪)ACZ 'TRAPF'⓪)ACZ 'TRAPGE'⓪)ACZ 'TRAPGT'⓪)ACZ 'TRAPHI'⓪)ACZ 'TRAPLE'⓪)ACZ 'TRAPLS'⓪)ACZ 'TRAPLT'⓪)ACZ 'TRAPMI'⓪)ACZ 'TRAPNE'⓪)ACZ 'TRAPPL'⓪)ACZ 'TRAPT'⓪)ACZ 'TRAPVC'⓪)ACZ 'TRAPVS'⓪)ACZ 'UNPK'⓪)⓪); Mnemonics 68881⓪)⓪)ACZ 'FMOVE' ; Umspeichern⓪)ACZ 'FMOVECR'⓪)ACZ 'FMOVEM'⓪)ACZ 'FRESTORE'⓪)ACZ 'FSAVE'⓪)ACZ 'FNOP'⓪)ACZ 'FTST'⓪)ACZ 'FBEQ' ; Controls⓪)ACZ 'FBF'⓪)ACZ 'FBGE'⓪)ACZ 'FBGL'⓪)ACZ 'FBGLE'⓪)ACZ 'FBGT'⓪)ACZ 'FBLE'⓪)ACZ 'FBLT'⓪)ACZ 'FBNE'⓪)ACZ 'FBNGE'⓪)ACZ 'FBNGL'⓪)ACZ 'FBNGLE'⓪)ACZ 'FBNGT'⓪)ACZ 'FBNLE'⓪)ACZ 'FBNLT'⓪)ACZ 'FBSEQ'⓪)ACZ 'FBSF'⓪)ACZ 'FBSNE'⓪)ACZ 'FBST'⓪)ACZ 'FBOGE'⓪)ACZ 'FBOGL'⓪)ACZ 'FBOGT'⓪)ACZ 'FBOLE'⓪)ACZ 'FBOLT'⓪)ACZ 'FBOR'⓪)ACZ 'FBT'⓪)ACZ 'FBUGE'⓪)ACZ 'FBUEQ'⓪)ACZ 'FBUN'⓪)ACZ 'FBUGT'⓪)ACZ 'FBULE'⓪)ACZ 'FBULT'⓪)ACZ 'FDBEQ'⓪)ACZ 'FDBF'⓪)ACZ 'FDBGE'⓪)ACZ 'FDBGL'⓪)ACZ 'FDBGLE'⓪)ACZ 'FDBGT'⓪)ACZ 'FDBLE'⓪)ACZ 'FDBLT'⓪)ACZ 'FDBNE'⓪)ACZ 'FDBNGE'⓪)ACZ 'FDBNGL'⓪)ACZ 'FDBNGLE'⓪)ACZ 'FDBNGT'⓪)ACZ 'FDBNLE'⓪)ACZ 'FDBNLT'⓪)ACZ 'FDBSEQ'⓪)ACZ 'FDBSF'⓪)ACZ 'FDBSNE'⓪)ACZ 'FDBST'⓪)ACZ 'FDBOGE'⓪)ACZ 'FDBOGL'⓪)ACZ 'FDBOGT'⓪)ACZ 'FDBOLE'⓪)ACZ 'FDBOLT'⓪)ACZ 'FDBOR'⓪)ACZ 'FDBT'⓪)ACZ 'FDBUGE'⓪)ACZ 'FDBUEQ'⓪)ACZ 'FDBUN'⓪)ACZ 'FDBUGT'⓪)ACZ 'FDBULE'⓪)ACZ 'FDBULT'⓪)ACZ 'FSEQ'⓪)ACZ 'FSF'⓪)ACZ 'FSGE'⓪)ACZ 'FSGL'⓪)ACZ 'FSGLE'⓪)ACZ 'FSGT'⓪)ACZ 'FSLE'⓪)ACZ 'FSLT'⓪)ACZ 'FSNE'⓪)ACZ 'FSNGE'⓪)ACZ 'FSNGL'⓪)ACZ 'FSNGLE'⓪)ACZ 'FSNGT'⓪)ACZ 'FSNLE'⓪)ACZ 'FSNLT'⓪)ACZ 'FSSEQ'⓪)ACZ 'FSSF'⓪)ACZ 'FSSNE'⓪)ACZ 'FSST'⓪)ACZ 'FSOGE'⓪)ACZ 'FSOGL'⓪)ACZ 'FSOGT'⓪)ACZ 'FSOLE'⓪)ACZ 'FSOLT'⓪)ACZ 'FSOR'⓪)ACZ 'FST'⓪)ACZ 'FSUGE'⓪)ACZ 'FSUEQ'⓪)ACZ 'FSUN'⓪)ACZ 'FSUGT'⓪)ACZ 'FSULE'⓪)ACZ 'FSULT'⓪)ACZ 'FTRAPEQ'⓪)ACZ 'FTRAPF'⓪)ACZ 'FTRAPGE'⓪)ACZ 'FTRAPGL'⓪)ACZ 'FTRAPGLE'⓪)ACZ 'FTRAPGT'⓪)ACZ 'FTRAPLE'⓪)ACZ 'FTRAPLT'⓪)ACZ 'FTRAPNE'⓪)ACZ 'FTRAPNGE'⓪)ACZ 'FTRAPNGL'⓪)ACZ 'FTRAPNGLE'⓪)ACZ 'FTRAPNGT'⓪)ACZ 'FTRAPNLE'⓪)ACZ 'FTRAPNLT'⓪)ACZ 'FTRAPSEQ'⓪)ACZ 'FTRAPSF'⓪)ACZ 'FTRAPSNE'⓪)ACZ 'FTRAPST'⓪)ACZ 'FTRAPOGE'⓪)ACZ 'FTRAPOGL'⓪)ACZ 'FTRAPOGT'⓪)ACZ 'FTRAPOLE'⓪)ACZ 'FTRAPOLT'⓪)ACZ 'FTRAPOR'⓪)ACZ 'FTRAPT'⓪)ACZ 'FTRAPUGE'⓪)ACZ 'FTRAPUEQ'⓪)ACZ 'FTRAPUN'⓪)ACZ 'FTRAPUGT'⓪)ACZ 'FTRAPULE'⓪)ACZ 'FTRAPULT'⓪)ACZ 'FADD' ; Dyadic Operations⓪)ACZ 'FCMP'⓪)ACZ 'FDIV'⓪)ACZ 'FMOD'⓪)ACZ 'FMUL'⓪)ACZ 'FREM'⓪)ACZ 'FSCALE'⓪)ACZ 'FSGLDIV'⓪)ACZ 'FSGLMUL'⓪)ACZ 'FSUB'⓪)ACZ 'FABS' ; Monidic Operations⓪)ACZ 'FACOS'⓪)ACZ 'FASIN'⓪)ACZ 'FATAN'⓪)ACZ 'FATANH'⓪)ACZ 'FCOS'⓪)ACZ 'FCOSH'⓪)ACZ 'FETOX'⓪)ACZ 'FETOXM1'⓪)ACZ 'FGETEXP'⓪)ACZ 'FGETMAN'⓪)ACZ 'FINT'⓪)ACZ 'FINTRZ'⓪)ACZ 'FLOGN'⓪)ACZ 'FLOGNP1'⓪)ACZ 'FLOG10'⓪)ACZ 'FLOG2'⓪)ACZ 'FNEG'⓪)ACZ 'FSIN'⓪)ACZ 'FSINH'⓪)ACZ 'FSQRT'⓪)ACZ 'FTAN'⓪)ACZ 'FTANH'⓪)ACZ 'FTENTOX'⓪)ACZ 'FTWOTOX'⓪)ACZ 'FSINCOS' ; Dual Monadic Operation⓪)⓪)ACZ 'FP0' ; 68881 Register⓪)ACZ 'FP1'⓪)ACZ 'FP2'⓪)ACZ 'FP3'⓪)ACZ 'FP4'⓪)ACZ 'FP5'⓪)ACZ 'FP6'⓪)ACZ 'FP7'⓪)ACZ 'FPCR'⓪)ACZ 'FPSR'⓪)ACZ 'FPIAR'⓪)⓪)*)⓪)⓪)DC.B 0⓪)SYNC⓪ END⓪ END ASMSBL;⓪ ⓪ ⓪ PROCEDURE BOTHSBL;⓪ BEGIN⓪ ASSEMBLER⓪)DC.W SymAnd⓪)ACZ 'AND'⓪)SYNC⓪)DC.W SymNot⓪)ACZ 'NOT'⓪)SYNC⓪)DC.W SymOr⓪)ACZ 'OR'⓪)DC.B 0⓪)SYNC⓪)DC.W 0⓪ END⓪ END BOTHSBL;⓪ ⓪ ⓪ (*⓪"901: Wrong addressing mode⓪"992: Illegal operand size⓪"903: Branch too long⓪"904: Illegal symbol⓪"905: Label expected⓪"906: Unknown label⓪"907: Number expected⓪"909: Odd address⓪"910: Modula keyword not allowed here⓪"911: Short branch not allowed here⓪"912: Label declared twice⓪"913: Logical addressing error⓪"914: Illegal Expression⓪"915: Warning: use only JMP to BOOT-ROM RTE-emulation !⓪"916: Operand out of Range⓪"917: 68020 mnemonic not allowed⓪"918: String too long⓪"919: unknown instruction⓪"920: Unsinnige Adr.-Art '([]...)'⓪"921: 68020 Adr-nicht erlaubt⓪"922: Use "MOVE fom SR" instruction instead⓪"950: (Warning:) Illegal addressing mode⓪ *)⓪ ⓪ CONST asmIllAM = 950;⓪ ⓪ PROCEDURE AERR1;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #901,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR1;⓪ ⓪ ⓪ PROCEDURE AERR2;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #902,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR2;⓪ ⓪ ⓪ PROCEDURE AERR3;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #903,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR3;⓪ ⓪ ⓪ PROCEDURE AERR4;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #904,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR4;⓪ ⓪ ⓪ PROCEDURE AERR5;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #905,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR5;⓪ ⓪ ⓪ PROCEDURE AERR6;⓪ BEGIN⓪ ASSEMBLER⓪"JSR IDfromTree⓪"MOVE.W #906,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR6;⓪ ⓪ ⓪ PROCEDURE AERR7;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #907,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR7;⓪ ⓪ ⓪ (* AERR8 gibts nicht mehr ! *)⓪ ⓪ ⓪ PROCEDURE AERR9;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #909,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR9;⓪ ⓪ ⓪ PROCEDURE AERR10;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #910,D5⓪#JMP SyntaxErr⓪ END⓪ END AERR10;⓪ ⓪ ⓪ PROCEDURE AERR11;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #911,D5⓪"JMP SyntaxErr⓪ END⓪ END AERR11;⓪ ⓪ ⓪ PROCEDURE AERR12;⓪ BEGIN⓪ ASSEMBLER⓪#MOVE.W #912,D5⓪#JMP SyntaxErr⓪ END⓪ END AERR12;⓪ ⓪ ⓪ PROCEDURE AERR13;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #913,D5 ; 'Logical Addressing Error'⓪"JMP SyntaxErr⓪ END⓪ END AERR13;⓪ ⓪ ⓪ PROCEDURE AERR14;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #914,D5 ; 'Illegal Expression'⓪"JMP SyntaxErr⓪ END⓪ END AERR14;⓪ ⓪ PROCEDURE AERR15;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #915,D5 ;'Warning: Use 'JMP $40C' '⓪"JMP SyntaxErr⓪ END⓪ END AERR15;⓪ ⓪ PROCEDURE AERR16;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #916,D5 ;'Operand out of Size' '⓪"JMP SyntaxErr⓪ END⓪ END AERR16;⓪ ⓪ PROCEDURE AERR17;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #917,D5 ; '68020 mnemonic not allowed'⓪"JMP SyntaxErr⓪ END⓪ END AERR17;⓪ ⓪ PROCEDURE AERR18;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #918,D5 ; 'String too long'⓪"JMP SyntaxErr⓪ END⓪ END AERR18;⓪ ⓪ PROCEDURE AERR19;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #919,D5 ; 'unknown instruction⓪"JMP SyntaxErr⓪ END⓪ END AERR19;⓪ ⓪ PROCEDURE AERR20;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #920,D5 ; Unsinnige Adr.-Art '([]...)'⓪"JMP SyntaxErr⓪ END⓪ END AERR20;⓪ ⓪ PROCEDURE AERR21;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #921,D5 ; 68020 Adr-nicht erlaubt⓪"JMP SyntaxErr⓪ END⓪ END AERR21;⓪ ⓪ PROCEDURE AERR22;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #922,D5 ; Use "MOVE fom SR" instruction instead⓪"JMP SyntaxErr⓪ END⓪ END AERR22;⓪ ⓪ PROCEDURE AERR23;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #923,D5 ; Function returns D0 - use '/'⓪"JMP SyntaxErr⓪ END⓪ END AERR23;⓪ ⓪ PROCEDURE AERR24;⓪ BEGIN⓪ ASSEMBLER⓪"MOVE.W #924,D5 ; No Asm in WITH⓪"JMP SyntaxErr⓪ END⓪ END AERR24;⓪ ⓪ ⓪ (*$ ? Gepard:⓪ PROCEDURE AsmWarning;⓪"BEGIN⓪$ASSEMBLER⓪); D2 enth. Fehlernummer, D3 die Position (0=Mnem., 1/2/3=Operand⓪)MOVEM.L D0-A6,-(A7)⓪)MOVE.L AsmOptions,D4⓪)BTST #23,D4 ; $W- ?⓪)BEQ noWarn⓪)SUBQ #1,D3⓪)BCS mne⓪)BEQ op1⓪)SUBQ #1,D3⓪)BEQ op2⓪)MOVE.L pTxtOp3,A2 ; Text-^ für Operand 3⓪)BRA warn⓪ op2 MOVE.L pTxtOp2,A2 ; Text-^ für Operand 2⓪)BRA warn⓪ op1 MOVE.L pTxtOp1,A2 ; Text-^ für Operand 1⓪)BRA warn⓪ mne MOVE.L pTxtMne,A2 ; Text-^ für Mnemonic⓪ warn MOVE D2,D5⓪)MOVE.L pLastSym,-(A7)⓪)MOVE.L pTxtLin,-(A7)⓪)MOVE.L A2,pLastSym⓪)MOVE.L pTxtLin2,pTxtLin⓪)JSR Warning⓪)MOVE.L (A7)+,pTxtLin⓪)MOVE.L (A7)+,pLastSym⓪ noWarn MOVEM.L (A7)+,D0-A6⓪$END⓪"END AsmWarning;⓪ *)⓪ ⓪ ⓪ PROCEDURE AsmSameSbl;⓪"BEGIN⓪$ASSEMBLER⓪(CLR GetLastSbl⓪(JSR SameSbl⓪(MOVE.L LastGSD2,D2⓪(TST.W D3⓪$END⓪"END AsmSameSbl;⓪ ⓪ PROCEDURE AsmGetSbl;⓪"BEGIN⓪$ASSEMBLER⓪(TST GetLastSbl⓪(BNE last⓪(JMP GetSbl⓪&last⓪(JMP AsmSameSbl⓪$END⓪"END AsmGetSbl;⓪ ⓪ ⓪ ⓪ PROCEDURE CopyLast;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L D0,-(A7)⓪-MOVE.L #ModeDest,D0⓪-SUB.L #ModeSource,D0⓪-SUBQ.L #1,D0⓪"L1 MOVE.B (A0)+,(A1)+⓪-DBRA D0,L1⓪-MOVE.L (A7)+,D0⓪-MOVEA.L (A7)+,A1⓪"END⓪"END CopyLast;⓪ ⓪ PROCEDURE SourceToLast;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L A1,-(A7)⓪-LEA ModeSource,A0⓪-LEA Mode,A1⓪-JMP CopyLast⓪"END⓪"END SourceToLast;⓪#⓪ PROCEDURE DestToLast;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L A1,-(A7)⓪-LEA ModeDest,A0⓪-LEA Mode,A1⓪-JMP CopyLast⓪"END⓪"END DestToLast;⓪ ⓪ PROCEDURE ThirdToLast;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L A1,-(A7)⓪-LEA ModeThird,A0⓪-LEA Mode,A1⓪-JMP CopyLast⓪"END⓪"END ThirdToLast;⓪ ⓪ PROCEDURE LastToThird;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L A1,-(A7)⓪-LEA Mode,A0⓪-LEA ModeThird,A1⓪-JMP CopyLast⓪"END⓪"END LastToThird;⓪ ⓪ PROCEDURE LastToDest;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L A1,-(A7)⓪-LEA Mode,A0⓪-LEA ModeDest,A1⓪-JMP CopyLast⓪"END⓪"END LastToDest;⓪ ⓪ PROCEDURE LastToSource;⓪"BEGIN⓪"ASSEMBLER⓪-MOVE.L A1,-(A7)⓪-LEA Mode,A0⓪-LEA ModeSource,A1⓪-JMP CopyLast⓪"END⓪"END LastToSource;⓪ ⓪ ⓪ PROCEDURE GetSize;⓪"BEGIN⓪"ASSEMBLER⓪+MOVE.W D3,-(A7)⓪+CMPI.B #'.',(A2)⓪+BNE SizeE ; -> keine Sizeangabe⓪+⓪+ADDQ.L #1,A2⓪+MOVE.B (A2)+,D3⓪+ANDI.B #$5F,D3 ;aus KLEIN mach gross...⓪+⓪+MOVEQ #$01,D0⓪+CMPI.B #'B',D3⓪+BEQ SizeE⓪+⓪+MOVEQ #$02,D0⓪+CMPI.B #'W',D3⓪+BEQ SizeE⓪+⓪+MOVEQ #$04,D0⓪+CMPI.B #'L',D3⓪+BEQ SizeE⓪+⓪+MOVEQ #$08,D0⓪+CMPI.B #'S',D3⓪+BEQ SizeE⓪"⓪+MOVEQ #$10,D0⓪+CMPI.B #'D',D3⓪+BEQ SizeE⓪"⓪+MOVEQ #$20,D0⓪+CMPI.B #'X',D3⓪+BEQ SizeE⓪"⓪+MOVEQ #$40,D0⓪+CMPI.B #'P',D3⓪+BEQ SizeE⓪"⓪+JMP AERR1⓪"⓪"SizeE MOVE.W (A7)+,D3⓪+MOVE.B D0,SizeOfData⓪"END⓪"END GetSize;⓪ ⓪ ⓪ PROCEDURE NewLabel;⓪"BEGIN⓪"ASSEMBLER JSR GETID0 ;Labelnamen in ID-Baum eintragen⓪+JSR PULLID⓪+JSR SETID⓪+MOVE.W #LabelID,-2(A1,D6.L) ;Type festlegen⓪+CLR.L -6(A1,D6.L)⓪+CLR.L -10(A1,D6.L)⓪+CLR.L -14(A1,D6.L)⓪+CLR.W -16(A1,D6.L) ; BOOLEAN, f. Flag, ob auf Label referiert wird⓪+MOVE.L D6,D2⓪+SUBI.L #16,D6⓪+MOVE.L D6,TRESPC⓪"END⓪"END NewLabel;⓪ ⓪ PROCEDURE SaveIDPtr; (* RETTET ^ x(A1,D2.L) NACH IDPtr *)⓪ BEGIN⓪"ASSEMBLER⓪$MOVEA.L A1,A0⓪$ADDA.L D2,A0⓪$ADDA.L D3,A0⓪$MOVE.L A0,IDPtr⓪$BSET #7,DataType⓪"END⓪ END SaveIDPtr;⓪ ⓪ ⓪ (*⓪!* Aufruf bei einem Proc-Call. Wenn Proc Result in D0 liefert, muß⓪!* nach dem Proc-Namen das Zeichen "/" folgen!⓪!*)⓪ PROCEDURE CheckProcResult;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L D2,-(A7)⓪(JSR AsmSameSbl⓪(BTST #8,D3⓪(BEQ ok⓪(JSR AsmGetSbl⓪(CMPI #AS5,D3 ; '/'⓪(BEQ ok⓪(JMP AERR23⓪%ok MOVE.L (A7)+,D2⓪$END⓪"END CheckProcResult;⓪ ⓪ (*⓪!* DATA HOLEN⓪!*)⓪ VAR SUBNEXT:BITE (* Flag *) ;⓪$SaveA2, SaveD2: (*$ ? RunGep: LONG *) (*$ ? RunST: LONGWORD *) ;⓪$SaveD3:WORD;⓪ PROCEDURE GetExpr;⓪ BEGIN⓪ ASSEMBLER⓪)SF SUBNEXT⓪)CLR.W DataType⓪)CLR.L Data⓪)⓪)MOVE.L OPTIONS,D0⓪)LSR #1,D0 ;Soll BREAK erfolgen ?⓪)BCC noBrk ;nein⓪)BREAK⓪)⓪ noBrk JSR AsmSameSbl⓪)CMPI.W #AS3,D3 ; '+'⓪)BEQ.W NUMDAT⓪)CMP #AS4,D3 ; '-'?⓪)BEQ.W NUMDAT⓪)BRA.W DATAL⓪)(*⓪)BNE.L DATAL⓪)ST SUBNEXT⓪ DATAPL2 JSR AsmGetSbl⓪)BRA.L DATAL⓪)*)⓪)⓪ AER1 JMP AERR1⓪ AER4 JMP AERR4⓪ AER14 JMP AERR14 ;'ILLEGAL EXPRESSION'⓪)⓪ RecFeld ; ermittele Record-Feld⓪)MOVE.L SaveD2,D2⓪)MOVE.W -2(A1,D2.L),D3 ;Hole ID-Typ⓪)MOVE.W D3,SaveD3⓪)ANDI.W #$80FF,D3⓪)CMPI.W #$800E,D3 ; ID = RECORD-FELD ?⓪)BEQ RecF3⓪)CMPI.W #$8011,D3 ; ID = VARIABLE ?⓪)BNE RecF2 ;Nein: direkt auf Typ testen⓪ RecF3 MOVE.L -10(A1,D2.L),D2 ;Hole Typ-^ nach D2⓪)MOVE.W -2(A1,D2.L),D3 ;Hole Typ⓪)ANDI.W #$80FF,D3⓪ RecF2 CMPI.W #$800D,D3 ;Typ = Record ?⓪)BEQ RecF4⓪)⓪)CLR.L Data ;alten Wert loeschen, weil er nicht⓪A;aufaddiert werden darf !⓪)CMPI.W #$800C,D3 ;Typ = Array ?⓪)BEQ RecF3⓪)CMPI.W #$8014,D3 ;Typ = Pointer ?⓪)BEQ RecF3⓪)⓪)JMP AERR4 ;Nein:ERROR⓪)⓪ RecF4 ; Verarbeite Record⓪)MOVE.L -14(A1,D2.L),D2 ;Hole loc.Rec-Tree-^ nach D2⓪)MOVE.B (A2),D1⓪)JSR LocalSearch ;suche ID in Rec.Tree⓪)BCS AER4 ;ERROR:Record-Feld nicht gefunden⓪)MOVE.L -6(A1,D2.L),D0 ;hole rel.Adr des Rec-Feldes⓪)MOVE.W SaveD3,D3⓪)ANDI.W #$0200,D3⓪)BEQ LocRec ;Lokale Rec-Var:Feld-Offset aufaddieren⓪)⓪)MOVE.W DataType,D3⓪)BTST #6,D3 ;Typenkennung f. glob Var testen⓪)BEQ LocRec ;ist schon geloescht -> (schon 2.Rec-Feld)⓪)CLR.L Data ;sonst:Glob.Adr loeschen⓪)⓪ LocRec CLR.W DataType ;Typenkennung f. lok. Var loeschen⓪)MOVEQ #5,D3⓪)BRA.L DATAFI ;-> Rel.Adr.des Feldes zu DATA addieren⓪)⓪)⓪ !DATAL JSR AsmSameSbl⓪)ANDI.W #$90FF,D3⓪)CMPI.W #$9011,D3 ;EXTERNAL VARIABLE ?⓪)BNE NEVARREF⓪)⓪+MOVE.L -6(A1,D2.L),D0⓪+MOVEQ #1,D3⓪+BRA.L DATAFI⓪ ⓪ NEVARREF JSR AsmSameSbl⓪)ANDI.W #$82FF,D3⓪)CMPI.W #$8211,D3 ;GLOBALE VARIABLE ?⓪)BNE NGVARREF⓪)⓪+MOVEQ #-14,D3⓪+JSR SaveIDPtr⓪+MOVEQ #6,D3⓪+BRA.L DATAFI⓪ ⓪ NGVARREF CMPI.W #$8011,D3 ;LOKALE VARIABLE ?⓪)BNE NOVARREF⓪+⓪+TST WithScope⓪+BEQ noWith⓪+JMP AERR24⓪)noWith⓪+⓪+MOVE.L -6(A1,D2.L),D0⓪+MOVEQ #9,D3⓪+BRA.L DATAFI⓪ ⓪ NOVARREF CMPI.W #$8206,D3 ;GLOBALE PROCEDURE?⓪)BNE NOPRCD⓪ ⓪+JSR CheckProcResult⓪+MOVEQ #-18,D3⓪+JSR SaveIDPtr⓪+MOVEQ #7,D3⓪+BRA.L DATAFI⓪ ⓪ NOPRCD CMPI.W #$8006,D3 ;LOKALE PROCEDURE?⓪)BNE NOLPRCD⓪)⓪+TST WithScope⓪+BEQ noWith2⓪+JMP AERR24⓪)noWith2⓪)⓪+JSR CheckProcResult⓪+MOVE.L -6(A1,D2.L),D0 ;Ist Adr. der Proc. schon bekannt ?⓪+BEQ LPRC0 ;Nein->Ref.^ merken.⓪+⓪+; lok. Proc. mit bekannter Adr.⓪+MOVEQ #10,D3⓪+BRA.L DATAFI⓪+⓪"LPRC0 ; lok. Proc. mit unbekannter Adr. / Vorw. Ref.⓪+MOVEQ #-18,D3⓪+JSR SaveIDPtr⓪+MOVEQ #10,D3⓪+BRA.L DATAFI⓪ ⓪ NOLPRCD CMPI.W #$820C,D3 ; ARRAY - TYP ?⓪)BEQ isTyped⓪)CMPI.W #$820D,D3 ; RECORD - TYP ?⓪)BEQ isTyped⓪)CMPI.W #$8214,D3 ; POINTER - TYP ?⓪)BNE NOPTR⓪ ⓪ isTyped CLR.L D0⓪+MOVEQ #14,D3⓪+BRA.L DATAFI⓪ ⓪ NOPTR ANDI.W #$80FF,D3⓪)CMP #$801C,D3 ;TABLE?⓪)BNE NOTAB⓪ ⓪+MOVEQ #-10,D3⓪+JSR SaveIDPtr⓪+MOVEQ #6,D3⓪+BRA.L DATAFI⓪)⓪ NOTAB CMPI.W #$800E,D3 ;Record-Feld ? (Tritt nur waehrend WITH auf)⓪)BNE NORECRD⓪ ⓪+JMP AERR24⓪)(* Ist erstmal verboten⓪+MOVE.L -6(A1,D2.L),D0⓪+MOVEQ #5,D3⓪+BRA.L DATAFI⓪)*)⓪ ⓪ NORECRD⓪ ⓪ (* das überlassen wir nun 'NUMDAT':⓪ ⓪*CMPI.W #$8012,D3 ;CONSTANT ?⓪*BNE.L NOCONST⓪ ⓪)(* dürfte gar nicht vorkommen:⓪6CMPI.W #8,-8(A1,D2.L) ;ist Const. 8 Byte lang ?⓪6BHI ERRILEXP⓪6BCS NOREALCONST⓪6MOVE.L -12(A1,D2.L),DATA⓪6MOVE.L -16(A1,D2.L),DATA2⓪6BRA REALEXIT⓪4NOREALCONST⓪)*)⓪ ⓪+MOVE.L -12(A1,D2.L),D0⓪+MOVEQ #0,D3⓪+CMPI.W #4,-8(A1,D2.L) ;ist Const. 4 Byte lang ?⓪+BNE DATAEXP ;NEIN:short Const.⓪+⓪+;Const. ist vom Typ LONG⓪+MOVEQ #11,D3⓪+TST.W DataType⓪+BEQ.L DATAFI ;OK: noch keine Expr.⓪+MOVE.W DataType,D3⓪+BTST #11,D3 ;Ist Expr. vom Typ L-Const. ?⓪+BNE.L DATACO ;JA: OK⓪+BTST #01,D3 ;Ist Expr. vom Typ External ?⓪+BNE.L DATACO ;JA: OK⓪"ERRILEXP JMP AERR14 ;ERROR:Ill.Expr.⓪ *)⓪ ⓪ NOCONST CMPI.W #$800A,D3 ;AUFZAEHLUNGSTYP ?⓪)BNE DATA2L⓪)⓪+CLR.L D0⓪+MOVE.W -4(A1,D2.L),D0⓪+MOVEQ #4,D3⓪+BRA.L DATAFI⓪ ⓪ DATA2L TST.W D3 ;Noch unbekanntes Label ?⓪)BNE NONEWLBL⓪)⓪+JSR NewLabel⓪+MOVE #1,-16(A1,D2.L) ; Referenz auf Label markieren⓪"C1 MOVEQ #-6,D3⓪+JSR SaveIDPtr⓪"C2 MOVEQ #8,D3⓪+BRA.L DATAFI⓪+⓪ NONEWLBL CMPI.W #LabelID,D3 ;BEKANNTES LABEL ?⓪)BNE NOLBL⓪)⓪+MOVE #1,-16(A1,D2.L) ; Referenz auf Label markieren⓪+MOVE.L -6(A1,D2.L),D0 ;Adresse des Labels⓪+BEQ C1 ;-> noch unbekannt⓪+⓪+TST.W DataType ;Expression ?⓪+BEQ C2 ;NEIN⓪+TST.B SUBNEXT⓪+BEQ AER14 ;Addition mit Label illegal⓪+MOVE.W DataType,D3⓪+BTST #8,D3⓪+BEQ AER14 ;ERROR: Source muss auch Label sein⓪+CLR.W D3⓪+BSET #0,D3 ;Label-Expr. als W-Konst. kennzeichnen⓪+MOVE.W D3,DataType⓪+BRA.L DATACO⓪)⓪ NOLBL CMPI.W #STRCONST,D3 ; CHARACTER o. STRING ?⓪)BNE NUMDAT⓪ ⓪+MOVE.B STRBUF,D0⓪+EXT.W D0⓪+EXT.L D0⓪+MOVE.W DataType,D3⓪+BEQ DATASTR1 ;keine Expr.->⓪+BTST #3,D3⓪+BEQ AER14 ;ERROR: Source muss auch String sein⓪+BRA.L DATACO⓪"DATASTR1 MOVEQ #3,D3⓪+BRA.L DATAFI⓪"⓪"NUMDAT JSR ConstExpr ; HOLE NUMERISCHE KONSTANTE⓪+JSR PullInt⓪+JSR adaptSStoCHAR⓪+MOVE.L D0,D2⓪+ADDQ #1,GetLastSbl ; auf TRUE setzen⓪+⓪+; erst auf REAL testen, denn das ist kein Skalar %%%%⓪+⓪+MOVE.W -2(A1,D2.L),D3⓪+CMPI.B #$02,D3 ; LONG REAL⓪+BEQ REALNUM⓪+CMPI.B #42,D3⓪+BEQ REALNUM ; SHORT REAL⓪+⓪+; kein REAL - hoffentlich ein skalarer Datentyp⓪+⓪+ANDI.W #$0100,D3⓪+BEQ AER1⓪+MOVE.L Accu,D0⓪+MOVEQ #2,D3⓪+⓪+TST.W DataType⓪+BEQ DATAFI⓪+BMI AER14 ; ERROR:Source-Adr./Wert noch unbekannt⓪+BRA.L DATACO ; OK: Wert aufrechnen ( W-Const. koennen⓪@; auf alle bek. Werte addiert werden )⓪ ⓪"REALNUM MOVE.L Accu,DATA⓪+MOVE.L AccuS14,DATA2⓪+MOVE.W DataType,D0⓪+BNE AER14⓪+BSET #12,D0⓪+MOVE.W D0,DataType ;ID-Typ merken⓪+JSR AsmGetSbl⓪+MOVE.L #DATA,D0⓪+RTS⓪ ⓪ DATAFI MOVE.L D0,-(A7)⓪)MOVE.W DataType,D0⓪)ANDI.W #$7FFF,D0⓪)BNE AER14 ;Es darf noch kein ID definiert sein⓪)MOVE.W DataType,D0⓪)BSET D3,D0⓪)MOVE.W D0,DataType ;ID-Typ merken⓪)MOVE.L (A7)+,D0⓪)⓪ DATACO TST.B SUBNEXT⓪)BEQ DATA5⓪)SUB.L D0,Data⓪)BRA DATA6⓪ DATA5 ADD.L D0,Data⓪)⓪ DATA6 MOVE.L D2,SaveD2⓪)JSR AsmGetSbl⓪)SF SUBNEXT⓪)CMPI.W #AS37,D3 ; '.'⓪)BEQ RecFeld⓪)⓪)CMPI.W #AS3,D3 ; '+'⓪)BEQ DATAPLUS⓪)CMP #AS4,D3 ; '-'⓪)BNE DATAENDL⓪)⓪)ST SUBNEXT⓪)MOVE.L D2,SaveD2⓪ DATAPLUS JSR AsmGetSbl⓪)BRA DATAL⓪ ⓪ DATAENDL ; Pruefe Datengroesse bez. 'DataType'⓪)MOVE.W DataType,D0⓪)⓪)BTST #14,D0 ;ist ID = TYPE ?⓪)BNE AER14 ;JA: ERROR⓪)⓪)ANDI.W #011000111001%,D0 ;maskiere alle L-Werte weg⓪)BEQ DATAEND2 ;OK: das Datum darf L-Werte haben⓪)⓪);Test,ob 'Data' groeser als WORD:⓪)CMPI.L #$10000,Data⓪)BCS DATAEND2⓪)CMPI.L #$FFFF0000,Data⓪)BHI DATAEND2⓪)JMP AERR16⓪ ⓪ DATAEND2 END⓪ END GetExpr;⓪ ⓪ ⓪ PROCEDURE RetTRUE;⓪"BEGIN⓪"ASSEMBLER MOVE.W D0,-(A7)⓪+JSR AsmGetSbl⓪+MOVE.W (A7)+,D0⓪+ORI #4,CCR⓪"END⓪"END RetTRUE;⓪ ⓪ ⓪ PROCEDURE RetFALSE;⓪"BEGIN⓪"ASSEMBLER ANDI #$FB,CCR⓪"END⓪"END RetFALSE;⓪ ⓪ ⓪ PROCEDURE Test_Dn;⓪ BEGIN⓪ ASSEMBLER JSR AsmSameSbl⓪)CMPI #AS18,D3 ;'D0'⓪)BCC L1⓪ L2 JMP RetFALSE⓪ !L1 CMPI #AS25,D3 ;'D7'⓪)BHI L2⓪)SUB #AS18,D3 ;'D0'⓪)MOVE D3,D0⓪)JMP RetTRUE⓪ END⓪ END Test_Dn;⓪ ⓪ ⓪ PROCEDURE Test_An;⓪ BEGIN⓪ ASSEMBLER JSR AsmSameSbl⓪)CMPI #AS_FP,D3 ;'FP'⓪)BNE L4⓪)MOVE VarReg,D0⓪)SUBQ #8,D0⓪)JMP RetTRUE⓪ L4 CMPI #AS26,D3 ;'SP'⓪)BNE L3⓪)MOVEQ #7,D0⓪)JMP RetTRUE⓪ L3 CMPI #AS10,D3 ;'A0'⓪)BCC L1⓪ L2 JMP RetFALSE⓪ !L1 CMPI #AS17,D3 ;'A7'⓪)BHI L2⓪)SUB #AS10,D3 ;'A0'⓪)MOVE D3,D0⓪)JMP RetTRUE⓪ END⓪ END Test_An;⓪ ⓪ (*$ ? Asm20:⓪ ⓪ PROCEDURE Test_FPn;⓪ BEGIN⓪ ASSEMBLER JSR AsmSameSbl⓪)CMPI #AS_FP0,D3 ;FP0⓪)BCS FPT1⓪)CMPI #AS_FP7,D3⓪)BHI FPT1⓪)SUB #AS_FP0,D3⓪)MOVE D3,D0⓪)JMP RetTRUE⓪ FPT1 JMP RetFALSE⓪ END⓪ END Test_FPn;⓪ ⓪ ⓪ PROCEDURE Test_FCn;⓪ BEGIN⓪ ASSEMBLER JSR AsmSameSbl⓪)CMPI #AS_FPIAR,D3⓪)BNE FCT1⓪)MOVEQ #$00,D0⓪ FCTRT JMP RETTRUE⓪ FCT1 CMPI #AS_FPSR,D3⓪)BNE FCT2⓪)MOVEQ #$01,D0⓪)BRA FCTRT⓪ FCT2 CMPI #AS_FPCR,D3⓪)BNE FCT3⓪)MOVEQ #$02,D0⓪)BRA FCTRT⓪ FCT3 JMP RETFALSE⓪ END⓪ END Test_FCn;⓪ *)⓪ ⓪ PROCEDURE Test_Rn;⓪ BEGIN⓪ ASSEMBLER JSR Test_Dn⓪)BEQ C1⓪)JSR Test_An⓪)BNE C2⓪)ADDQ.L #8,D0⓪ C1 ORI #4,CCR⓪ C2⓪ END⓪ END Test_Rn;⓪ ⓪ ⓪ PROCEDURE Test_Ind_An;⓪ BEGIN⓪ ASSEMBLER JSR AsmSameSbl⓪)CMPI #AS1,D3 ; '(' ?⓪)BEQ L1⓪ !JDR1 JMP RetFALSE⓪ !L1 CMPI.B #'A',(A2)⓪)BEQ ARIND1⓪)CMPI.B #'a',(A2)⓪)BEQ ARIND1⓪)CMPI.B #'S',(A2) ; vielleicht SP ?⓪)BEQ ARIND1SP⓪)CMPI.B #'s',(A2) ; vielleicht SP ?⓪)BNE JDR1⓪ ARIND1SP CMPI.B #'P',1(A2)⓪)BEQ ARIND2⓪)CMPI.B #'p',1(A2)⓪)BEQ ARIND2⓪)BRA JDR1⓪ ARIND1 CMPI.B #'0',1(A2)⓪)BCS JDR1⓪)CMPI.B #'7',1(A2)⓪)BHI JDR1⓪ ARIND2 CMPI.B #')',2(A2)⓪)BNE JDR1⓪)JSR AsmGetSbl⓪)JSR Test_An⓪)BEQ OK⓪)JMP AERR1⓪ !OK CMPI #AS2,D3 ; ')'⓪)BNE JDR1⓪)JMP RetTRUE⓪ END⓪ END Test_Ind_An;⓪ ⓪ ⓪ PROCEDURE Test_Ind_Dn;⓪ BEGIN⓪ ASSEMBLER JSR AsmSameSbl⓪)CMPI #AS1,D3 ; '(' ?⓪)BEQ L1⓪ !JDR1 JMP RetFALSE⓪ !L1 CMPI.B #'D',(A2)⓪)BEQ ARIND1⓪)CMPI.B #'d',(A2)⓪)BNE JDR1⓪ ARIND1 CMPI.B #'0',1(A2)⓪)BCS JDR1⓪)CMPI.B #'7',1(A2)⓪)BHI JDR1⓪)CMPI.B #')',2(A2)⓪)BNE JDR1⓪)JSR AsmGetSbl⓪)JSR Test_Dn⓪)BEQ OK⓪)JMP AERR1⓪ !OK CMPI #AS2,D3 ; ')'⓪)BNE JDR1⓪)JMP RetTRUE⓪ END⓪ END Test_Ind_Dn;⓪ ⓪ ⓪ VAR KommaExp:BITE; (* Bit 0 gesetzt: Komma ist bei nächstem Symbol erlaubt *)⓪'Outer:BITE; (* FLAG *)⓪ PROCEDURE GetEA_U;⓪ BEGIN⓪ ASSEMBLER CLR.B Mode⓪)CLR.W DataType⓪)CLR.L Data⓪)CLR.W RegList⓪)CLR.B Reg⓪)CLR.B M20Flg⓪)BCLR #0,KommaExp⓪)⓪)JSR Test_Rn⓪)BNE.L GADRFP⓪)⓪)CMPI #AS5,D3 ;'/'⓪)BEQ GADR3⓪)CMPI #AS4,D3 ;'-'⓪)BEQ GADRM⓪)⓪+CMPI.W #8,D0⓪+BCS DN⓪+⓪+MOVE.B #2,Mode⓪+ANDI.B #7,D0⓪+MOVE.B D0,Reg⓪+RTS⓪+⓪"DN MOVE.B #1,Mode⓪+MOVE.B D0,Reg⓪+RTS⓪+⓪";Registerliste auswerten⓪"GADR3 MOVE RegList,D2⓪+BSET D0,D2⓪+MOVE D2,RegList⓪"GADR34 CMPI #AS5,D3 ;'/'⓪+BEQ GADR5⓪+CMPI #AS4,D3 ;'-'⓪+BEQ GADRM⓪+MOVE.B #18,Mode⓪+RTS⓪+⓪"!GADR5 JSR AsmGetSbl⓪+JSR Test_Rn⓪+BEQ GADR3⓪+⓪"AER1 JMP AERR1⓪"AER20 JMP AERR20⓪+⓪"GADRM MOVE.W D0,-(A7)⓪+JSR AsmGetSbl⓪+JSR Test_Rn⓪+BNE AER1⓪+MOVE.W (A7)+,D1⓪+CMP.W D1,D0⓪+BCC GADRM2⓪+JMP AERR2 ;ERROR: 2.Reg.>1.Reg.⓪"GADRM2 MOVE.W RegList,D2⓪+BSET D1,D2⓪+MOVE.W D2,RegList⓪+ADDQ.W #1,D1⓪+CMP.W D0,D1⓪+BLS GADRM2⓪+BRA GADR34⓪)⓪); Flotingpoint register testen⓪ GADRFP⓪ (*$ ? Asm20:⓪)JSR Test_FPn⓪)BNE.L GADRFC⓪+⓪)CMPI #AS5,D3 ;'/'⓪)BEQ GADRFP3⓪)CMPI #AS4,D3 ;'-'⓪)BEQ GADRFPM⓪+⓪+MOVE.B #25,Mode⓪+MOVE.B D0,Reg⓪+RTS⓪+⓪+;Floatingpoint Registerliste auswerten⓪"GADRFP3 MOVE RegList,D2⓪+BSET D0,D2⓪+MOVE D2,RegList⓪"GADRFP34 CMPI #AS5,D3 ;'/'⓪+BEQ GADRFP5⓪+CMPI #AS4,D3 ;'-'⓪+BEQ GADRFPM⓪+MOVE.B #26,Mode⓪+RTS⓪+⓪"GADRFP5 JSR AsmGetSbl⓪+JSR Test_FPn⓪+BEQ GADRFP3⓪+BRA.L AER1⓪+⓪"GADRFPM MOVE.W D0,-(A7)⓪+JSR AsmGetSbl⓪+JSR Test_FPn⓪+BNE.L AER1⓪+MOVE.W (A7)+,D1⓪+CMP.W D1,D0⓪+BCC GADRFPM2⓪+JMP AERR2 ;ERROR: 2.Reg.>1.Reg.⓪"GADRFPM2 MOVE.W RegList,D2⓪+BSET D1,D2⓪+MOVE.W D2,RegList⓪+ADDQ.W #1,D1⓪+CMP.W D0,D1⓪+BLS GADRFPM2⓪+BRA GADRFP34⓪)⓪+⓪); Floatingpoint control-Register Testen⓪ GADRFC JSR Test_FCn⓪)BNE GADR1⓪)⓪)CMPI #AS5,D3 ;'/'⓪)BEQ GADRFC3⓪)⓪+MOVE.B #27,Mode⓪+MOVE.B D0,Reg⓪+RTS⓪+⓪+; Floatingpoint control-Registerliste auswerten⓪"GADRFC3 MOVE RegList,D2⓪+BSET D0,D2⓪+MOVE D2,RegList⓪+CMPI #AS5,D3 ;'/'⓪+BEQ GADRFC5⓪+MOVE.B #28,Mode⓪+RTS⓪+⓪"GADRFC5 JSR AsmGetSbl⓪+JSR Test_FCn⓪+BEQ GADRFC3⓪+BRA.L AER1⓪ ⓪ GADR1⓪'*)⓪+JSR Test_Ind_An⓪+BNE GADR8⓪)⓪+MOVE.B D0,Reg⓪+MOVE.B #4,Mode⓪+CMPI #AS3,D3 ;'+'⓪+BEQ GADR7⓪+MOVE.B #3,Mode⓪+RTS⓪"!GADR7 JMP AsmGetSbl⓪ ⓪ GADR8 JSR Test_Ind_Dn⓪)BNE GADR81⓪)⓪+MOVE.B D0,Reg⓪+MOVE.B #17,Mode⓪+RTS⓪ ⓪ GADR81 CMPI #AS4,D3 ; '-' ?⓪)BNE GADR9⓪)⓪+CMPI.B #'(',(A2)⓪+BNE.L GADR11 ;keine Klammer? Dann ist es eine num.Konstante⓪+⓪+JSR AsmGetSbl⓪+JSR Test_Ind_An⓪+BNE AER1⓪+MOVE.B D0,Reg⓪+MOVE.B #5,Mode⓪+RTS⓪ ⓪ GADR9 CMPI #AS9,D3 ; '#'⓪)BNE GADR10⓪)⓪+; '#data'⓪+MOVE.B #12,Mode⓪+JSR AsmGetSbl⓪+JMP GetExpr⓪ ⓪ GADR10 CMPI #AS29,D3 ; SR ? nein ->⓪)BNE GADR28⓪+⓪+MOVE.B #13,Mode⓪+JMP AsmGetSbl⓪ ⓪ GADR28 CMPI #AS30,D3 ; USP ?⓪)BNE GADR29⓪+⓪+MOVE.B #14,Mode⓪+JMP AsmGetSbl⓪ ⓪ GADR29 CMPI #AS31,D3 ; CCR ? nein ->⓪)BNE GADR30⓪+⓪+MOVE.B #15,Mode⓪+JMP AsmGetSbl⓪)⓪ GADR30 CMPI #AS32,D3 ; VBR ? nein ->⓪)BNE.L GADR100⓪+⓪+MOVE.B #16,Mode⓪+JMP AsmGetSbl⓪ ⓪ TstScale ; Scaling auswerten⓪-⓪-MOVE.B #1,IndScale⓪-CMPI #AS_Astrx,D3⓪-BNE TscE⓪-JSR AsmGetSbl⓪-MOVE.L Data,-(A7) ; Data retten, da von GetExpr zerstört⓪-MOVE DataType,-(A7) ; ebenfalls retten⓪-JSR GetExpr⓪-MOVE DataType,D0⓪-ANDI #1111111111010%,D0 ; nur Consts erlaubt⓪-BEQ Gadr183⓪-JMP AERR13 ;'ILLEGAL adressing mode'⓪$AER2 JMP AERR2 ;'ILLEGAL operand size'⓪$Gadr183 MOVE.L Data,D0 ; als Data nur 1,2,4 oder 8 erlaubt⓪-MOVE (A7)+,DataType⓪-MOVE.L (A7)+,Data⓪-TST.L D0⓪-BEQ AER2⓪-CMPI.L #8,D0⓪-BEQ Gadr185⓪-CMPI.L #4,D0⓪-BHI AER2⓪-BEQ Gadr185⓪-CMPI.B #3,D0⓪-BEQ AER2⓪$Gadr185 ; Alles OK⓪-MOVE.B D0,IndScale⓪$TscE RTS⓪-⓪ ; Überprüfung aller erw. Adr.-Arten der 68020⓪ ⓪ GADR100⓪ (*$ ? Asm20:⓪)CMPI #AS_SFC,D3⓪)BNE GADR101⓪)⓪+MOVE.B #19,Mode⓪+JMP AsmGetSbl⓪)⓪ Gadr101 CMPI #AS_DFC,D3⓪)BNE GADR102⓪)⓪+MOVE.B #20,Mode⓪+JMP AsmGetSbl⓪)⓪ Gadr102 CMPI #AS_CACR,D3⓪)BNE GADR103⓪)⓪+MOVE.B #21,Mode⓪+JMP AsmGetSbl⓪)⓪ Gadr103 CMPI #AS_CAAR,D3⓪)BNE GADR130⓪)⓪+MOVE.B #22,Mode⓪+JMP AsmGetSbl⓪)⓪ Gadr130 CMPI #AS_MSP,D3⓪)BNE GADR131⓪)⓪+MOVE.B #23,Mode⓪+JMP AsmGetSbl⓪)⓪ Gadr131 CMPI #AS_ISP,D3⓪)BNE GADR104⓪)⓪+MOVE.B #24,Mode⓪+JMP AsmGetSbl⓪)⓪ Gadr104 CMPI #AS1,D3 ; '(' ?⓪)BNE.L GADR11⓪)⓪)MOVE.L OPTIONS,D2⓪)LSR #1,D2 ;Soll BREAK erfolgen ?⓪)BCC noBrk ;nein⓪)BREAK⓪)⓪ noBrk ; erw. Adr. Arten mit '([bd,An/PC],Xn.Size*Scale],od)'⓪)⓪+MOVE.B #7,Mode ; Nehmen wir erstmal an⓪+⓪"GadrLoop JSR AsmGetSbl⓪+⓪"GadrLpC CMPI #AS38,D3 ; ',' ?⓪+BNE GADR142⓪-⓪-BCLR #0,KommaExp⓪-BEQ AER1⓪-BRA GadrLoop⓪-⓪"Gadr142 CMPI #AS2,D3 ; ')' ?⓪+BNE GADR105⓪-⓪-; Test, ob nur '[' oder nur ']', sonst Ende⓪-BTST #FlgeKlA,M20Flg⓪-BEQ Gadr140⓪-BTST #FlgeKlZ,M20Flg⓪-BEQ AER1⓪$Gadr141 BSET #FlgIs20,M20Flg ; So hiermit wird erw. Adr-Art markiert⓪-JMP AsmGetSbl⓪-⓪$Gadr140 BTST #FlgeKlZ,M20Flg⓪-BNE AER1⓪-BRA Gadr141⓪-⓪"Gadr105 CMPI #AS_eKlA,D3 ; '[' ?⓪+BNE GADR106⓪-⓪-TST.B M20Flg⓪-BNE AER1 ; Es darf noch nix markiert sein⓪-BSET #FlgeKlA,M20Flg⓪-BRA GadrLoop⓪-⓪"Gadr106 CMPI #AS_eKlZ,D3 ; ']' ?⓪+BNE GADR107⓪-⓪-MOVE.B M20Flg,D0⓪-BCLR #FlgeKlA,D0⓪-BEQ AER1 ; '[' muß schon auf sein⓪-TST.B D0⓪-BEQ AER20 ; unsinnige Adr.-Art⓪-BSET #FlgeKlZ,M20Flg⓪-BNE AER1 ; ']' darf noch nicht gewesen sein⓪-BSET #0,KommaExp⓪-BTST #FlgXn,D0⓪-BEQ GadrLoop⓪-BSET #FlgPreIx,M20Flg ; PreIndexed markieren⓪-BRA GadrLoop⓪-⓪"Gadr107 CMPI #AS35,D3 ; 'PC' ?⓪+BNE GADR108⓪-⓪-MOVE.B #11,Mode ; Korrektur der Annahme⓪-JSR AsmGetSbl⓪-⓪$Gadr170 MOVE.B M20Flg,D0⓪-BCLR #FlgeKlA,D0⓪-BCLR #Flgbd,D0⓪-TST.B D0⓪-BNE AER1⓪-BSET #FlgAnPC,M20Flg⓪-BSET #0,KommaExp⓪-BRA GadrLpC⓪-⓪"Gadr108 JSR Test_Rn⓪+BNE.L GADR109⓪-⓪-CMPI #AS37,D3 ; '.' ?⓪-BEQ GADR181 ; Ja -> muß Indexreg. sein⓪/⓪/SUBQ #8,D0 ; Adreßregister ?⓪/BCS AER1 ; Nein -> Error⓪/⓪/; Base Register An⓪/MOVE.B D0,Reg⓪/BRA Gadr170⓪/⓪$Gadr181 ; Index Register Xn.Size*Scale⓪-⓪-CMPI #8,D0⓪-SCS IndType⓪-ANDI #7,D0⓪-MOVE.B D0,IndReg⓪-⓪-BSET #FlgXn,M20Flg⓪-BNE AER1⓪-BTST #FlgOd,M20Flg⓪-BNE AER1⓪-⓪-MOVE.B #4,IndSize⓪-CMPI.B #'L',(A2)⓪-BEQ GADR182⓪-CMPI.B #'l',(A2)⓪-BEQ GADR182⓪-MOVE.B #2,IndSize⓪-CMPI.B #'W',(A2)⓪-BEQ GADR182⓪-CMPI.B #'w',(A2)⓪-BNE AER1⓪)⓪$GADR182 ADDQ.L #1,A2⓪-JSR AsmGetSbl⓪-BSR TstScale⓪-BSET #0,KommaExp⓪-BRA GadrLpC⓪-⓪"Gadr109 ; Jetzt kann's nur noch OD oder BD sein⓪-⓪-BTST #FlgeKlZ,M20Flg⓪-SNE Outer⓪-⓪-MOVE.L Data,-(A7) ; Data retten, da von GetExpr zerstört⓪-MOVE DataType,-(A7) ; ebenfalls retten⓪-JSR GetExpr⓪-MOVE.L Data,D0⓪-MOVE DataType,D1⓪-MOVE (A7)+,DataType⓪-MOVE.L (A7)+,Data⓪-TST.B Outer⓪-BNE Gadr191⓪-⓪-; Base Displacement⓪-MOVE.L D0,Data⓪-MOVE D1,DataType⓪-MOVE.B M20Flg,D2⓪-BCLR #FlgeKlA,D2⓪-TST.B D2 ; außer '[' darf noch nix sein⓪-BNE AER1⓪-BSET #FlgBd,M20Flg⓪-BNE AER1⓪-BSET #0,KommaExp⓪-BRA GadrLpC⓪-⓪$Gadr191 ; Outer Displacement⓪-BSET #FlgOd,M20Flg⓪-BNE AER1⓪-MOVE.L D0,DataOd⓪-MOVE D1,DataTypeOd⓪-BRA GadrLpC⓪ *)⓪-⓪ ; Ausdruck holen und Test auf indirekte Adr. (alte 68000 Adr.-Arten)⓪ ⓪ GADR11 JSR GetExpr ;Ausdruck wird ausdruecklich erwartet.⓪)JSR Test_Ind_An⓪)BNE.L GADR13⓪)⓪+; 'd16(An)'⓪+MOVE.B D0,Reg⓪+MOVE.B #6,Mode⓪+RTS⓪ ⓪ GADR13 CMPI.W #AS1,D3 ; '(' ?⓪)BEQ GADR14⓪)⓪+; 'd32'⓪+MOVE.B #9,Mode⓪+RTS⓪)⓪ GADR14 JSR AsmGetSbl⓪)JSR Test_An⓪)BEQ GADR19⓪)⓪)CMPI #AS35,D3 ; 'PC' ?⓪)BNE AER1⓪)⓪+JSR AsmGetSbl⓪+CMPI #AS2,D3 ; ')' ?⓪+BNE GADR26⓪+⓪-; 'd16(PC)'⓪-MOVE.B #10,Mode⓪-JMP AsmGetSbl⓪"⓪"GADR26 ; 'd8(PC,Rn.X)'⓪+MOVE.B #11,Mode⓪+BRA.L GADR24⓪+⓪"GADR19 ; 'd8(An,Rn.X)'⓪+MOVE.B D0,Reg⓪+MOVE.B #7,Mode⓪ ⓪"!GADR24 CMPI.W #AS38,D3 ; ',' ?⓪+BNE AER1⓪+JSR AsmGetSbl⓪+JSR Test_Rn⓪+BNE AER1⓪+CMPI #8,D0⓪+SCS IndType⓪+ANDI #7,D0⓪+MOVE.B D0,IndReg⓪+CMPI #AS37,D3 ; '.'⓪+BNE AER1⓪+⓪+MOVE.B #4,IndSize⓪+CMPI.B #'L',(A2)⓪+BEQ GADR39⓪+CMPI.B #'l',(A2)⓪+BEQ GADR39⓪+⓪+MOVE.B #2,IndSize⓪+CMPI.B #'W',(A2)⓪+BEQ GADR39⓪+CMPI.B #'w',(A2)⓪+BNE AER1⓪+⓪"GADR39 ADDQ.L #1,A2⓪+JSR AsmGetSbl⓪+BSR TstScale⓪+CMPI.W #AS2,D3 ; ')'⓪+BNE AER1⓪+JMP AsmGetSbl⓪ END⓪ END GetEA_U;⓪ ⓪ PROCEDURE GetEA_U0;⓪ BEGIN⓪ ASSEMBLER JSR GetEA_U⓪ (*$ ? Asm20:⓪)MOVE.L AsmOptions,D0⓪)BTST #24,D0 ; $X in Options ?⓪)BNE ok ; Ja: 68020-EAs erlaubt⓪)MOVE.B Mode,D0⓪)CMPI.B #17,D0⓪)BEQ err0⓪)CMPI.B #18,D0⓪)BHI err0⓪)BTST #FlgIs20,M20Flg⓪)BEQ ok⓪ err0 JMP AERR21⓪ ok⓪ *)⓪ END⓪ END GetEA_U0;⓪ ⓪ PROCEDURE GetEA;⓪ BEGIN⓪ ASSEMBLER JSR GetEA_U0⓪ ⓪ (*$ ? Asm20:⓪ ⓪ ; Test auf Bitfield (static/dynamic k-Factor bei FPU)⓪)JSR AsmSameSbl⓪)CMPI #AS_gKlA,D3 ; '{' ?⓪)BNE.L NotBitField⓪)⓪)JSR AsmGetSbl⓪)BSR.L GetIndic⓪)MOVE.W D1,-(A7)⓪)CMPI #AS_dPnkt,D3 ; ':' ?⓪)BNE TestFormatQualifier⓪)⓪)TST.W (A7)+⓪)BNE isRegO⓪)CMPI.L #31,D0 ; als Data nur 0-31 erlaubt⓪)BHI.L AER2⓪ isRegO OR D1,D0⓪)MOVE.B D0,BitOffs⓪)JSR AsmGetSbl⓪)BSR.L GetIndic⓪)BNE isRegW⓪)CMPI.L #32,D0 ; als Data nur 1-32 erlaubt⓪)BHI.L AER2⓪)TST D0⓪)BEQ.L AER2⓪)ANDI #$1F,D0⓪ isRegW OR D1,D0⓪)MOVE.B D0,BitWidth⓪)CMPI #AS_gKlZ,D3 ; '}' ?⓪)BNE.L AER1⓪)BSET #6,Mode⓪)JMP AsmGetSbl⓪ ⓪ TestFormatQualifier⓪)MOVE.W MODE,MODE2 ; 68881 Formatangaben⓪)TST.W (A7)+⓪)BNE isRegf⓪)⓪)MOVE.B #30,MODE⓪)CMPI.L #17,D0 ; Nur Werte von -64 ... +17 zulässig⓪)BGT AER1⓪)CMPI.L #-64,D0⓪)BLT AER1⓪)ANDI.B #$7F,D0⓪)BRA testkzu⓪)⓪ isRegf⓪)MOVE.B #29,MODE⓪ ⓪ testkzu⓪)MOVE.B D0,Format⓪)CMPI #AS_gKlZ,D3 ; '}' ?⓪)BNE AER1⓪)JMP AsmGetSbl⓪ ⓪ NotBitField⓪); Nun testen wir auf Doppelregister⓪)CMPI #AS_dPnkt,D3 ; ':' ?⓪)BNE NoDoubleReg⓪)⓪)MOVE.B mode,-(A7)⓪)MOVE.B reg,-(A7) ; Data und DataType brauchen wir nicht retten⓪)JSR AsmGetSbl⓪)JSR GetEA_U0⓪)MOVE.B reg,reg2⓪)MOVE.B (A7)+,reg⓪)MOVE.B Mode,mode2⓪)MOVE.B (A7)+,mode⓪)BSET #7,Mode⓪)RTS⓪)⓪ NoDoubleReg⓪)RTS⓪ ⓪ AER1 JMP AERR1⓪ AER2 JMP AERR2⓪ AER13 JMP AERR13⓪ ⓪ GetIndic JSR Test_Dn⓪)BNE c1⓪)MOVEQ #$20,D1 ; Markierung f. Register-Indizierung⓪)RTS⓪ c1 CMPI #AS9,D3 ; '#' einfach ignorieren (bei k-Factor)⓪)BNE c2⓪)JSR AsmGetSbl⓪ c2 MOVE.L Data,-(A7) ; Data retten, da von GetExpr zerstört⓪)MOVE DataType,-(A7)⓪)JSR GetExpr⓪)MOVE DataType,D0⓪)ANDI #1111111111010%,D0 ; nur Consts erlaubt⓪)BNE AER13⓪)MOVE.L Data,D0⓪)MOVE (A7)+,DataType⓪)MOVE.L (A7)+,Data⓪)MOVEQ #0,D1⓪ *)⓪ END⓪ END GetEA;⓪ ⓪ PROCEDURE RegTo0_2;⓪ BEGIN⓪ ASSEMBLER OR.B D0,D1⓪ END⓪ END RegTo0_2;⓪ ⓪ PROCEDURE RegTo9_11;⓪ BEGIN⓪ ASSEMBLER ANDI #$FF,D0⓪)LSL #4,D0⓪)LSL #5,D0⓪)OR D0,D1⓪ END⓪ END RegTo9_11;⓪)⓪ PROCEDURE SizeTo6_7;⓪ BEGIN⓪ ASSEMBLER TST.B D0⓪)BNE OK⓪)JMP AERR2⓪ OK CMPI.B #1,D0⓪)BEQ ADR3A⓪)CMPI.B #2,D0⓪)BEQ ADR3B⓪)ORI #$80,D1⓪)RTS⓪ ADR3B ORI #$40,D1⓪ !ADR3A RTS⓪ END⓪ END SizeTo6_7;⓪ ⓪ ⓪ PROCEDURE VerifySize;⓪ BEGIN⓪ ASSEMBLER CMP.B SizeOfData,D0⓪)BEQ C1⓪)TST.B SizeOfData⓪)BEQ C1⓪)JMP AERR2⓪ C1 ;altes D0 bleibt erhalten⓪)RTS⓪ END⓪ END VerifySize;⓪ ⓪ ⓪ PROCEDURE LoadSize;⓪ BEGIN⓪ ASSEMBLER MOVE.B SizeOfData,D0⓪)BNE C1⓪)MOVEQ #DefltSiz,D0⓪ C1 CMPI.B #4,D0⓪)BLS ok⓪)JMP AERR2⓪ ok⓪ END⓪ END LoadSize;⓪ ⓪ ⓪ PROCEDURE ErrIfSize;⓪ BEGIN⓪ ASSEMBLER TST.B SizeOfData⓪)BEQ C1⓪)JMP AERR2⓪ C1 RTS⓪ END⓪ END ErrIfSize;⓪ ⓪ ⓪ PROCEDURE SizeTo12_13;⓪ (* D0 nicht verändern ! *)⓪ BEGIN⓪ ASSEMBLER CMPI.B #1,D0⓪)BEQ ADR10A⓪)CMPI.B #4,D0⓪)BEQ ADR10B⓪)ORI #$3000,D1⓪)RTS⓪ !ADR10A ORI #$1000,D1⓪)RTS⓪ !ADR10B ORI #$2000,D1⓪ END⓪ END SizeTo12_13;⓪ ⓪ ⓪ PROCEDURE SizeTo9_10; (* 00/01/10 *)⓪ BEGIN⓪ ASSEMBLER CMPI.B #1,D0⓪)BEQ ADR10A⓪)CMPI.B #4,D0⓪)BEQ ADR10B⓪)BSET #9,D1⓪)RTS⓪ adr10b BSET #10,D1⓪ adr10a⓪ END⓪ END SizeTo9_10;⓪ ⓪ ⓪ PROCEDURE Size2To9_10; (* 01/10/11 *)⓪ BEGIN⓪ ASSEMBLER ORI #$0600,D1⓪)CMPI.B #4,D0⓪)BEQ ADR10A⓪)CMPI.B #2,D0⓪)BEQ ADR10B⓪)BCLR #10,D1⓪)RTS⓪ adr10b BCLR #9,D1⓪ adr10a⓪ END⓪ END Size2To9_10;⓪ ⓪ ⓪ PROCEDURE ErrIfOp2;⓪ BEGIN⓪ ASSEMBLER TST.B ModeDest⓪)BEQ OK⓪)JMP AERR1⓪ !OK RTS⓪ END⓪ END ErrIfOp2;⓪ ⓪ ⓪ (*⓪ * <ea> nach D1, Bit 0-5⓪ *)⓪ PROCEDURE EAto0_5;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W D1,-(A7)⓪)CLR.W D1⓪)MOVE.B Mode,D0⓪)BEQ.L JAER1 ;ERROR: Operand expected⓪)CMPI.B #8,D0 ; d16,d24,(PC),#data ?⓪)BCC.L ADREA1 ; ja ->⓪)⓪)CMPI.B #6,D0 ; d16(An) ?⓪)BEQ ADREA3 ; ja ->⓪)⓪)CMPI.B #2,D0 ;'An' ?⓪)BNE C1⓪)CMPI.B #1,SizeOfData ;'.B' ?⓪)BEQ.L AER2 ;ERROR: Byteverarb. bei Adr-Reg. nicht zugel.⓪ C1 SUBQ.B #1,D0⓪)LSL #3,D0⓪)OR.B D0,D1⓪)MOVE.B Reg,D0⓪)JSR RegTo0_2⓪ E0 OR.W (A7)+,D1⓪)RTS⓪ ⓪ ADREA3 TST.L Data⓪)BNE C1⓪)MOVE DataType,D0⓪)ANDI #0000001000111010%,D0 ; Konst., aber nicht explizit ?⓪)BEQ C12⓪)⓪)MOVEQ #3,D0 ; d16(An) -> (An) optimieren⓪)MOVE.B D0,Mode⓪)BRA C1⓪)⓪ C12 MOVEQ #6,D0⓪)BRA C1⓪)⓪ ADREA1 ORI.B #111000%,D1⓪)CMPI.B #13,D0⓪)BCC ADREA11⓪)⓪)SUBQ.B #8,D0⓪)OR.B D0,D1⓪)ADDQ.B #8,D0⓪)BRA E0⓪ ⓪ ADREA11 CMPI.B #15,D0 ; 'CCR' ?⓪)BEQ ADREA10⓪)CMPI.B #13,D0 ; 'SR' ?⓪)BEQ ADREA10⓪ ⓪ JAER1 JMP AERR1⓪ AER2 JMP AERR2⓪ ⓪ ADREA10 ORI.B #4,D1⓪)BRA E0⓪ END⓪ END EAto0_5;⓪ ⓪ ⓪ (* haenge D0.W im Code an *)⓪ PROCEDURE ApndD0_W;⓪ BEGIN⓪ ASSEMBLER⓪)ADDQ #1,D5⓪)MOVE D0,(A4)+⓪ END⓪ END ApndD0_W;⓪ ⓪ (* haenge D0.L im Code an *)⓪ PROCEDURE ApndD0_L;⓪ BEGIN⓪ ASSEMBLER ADDQ #2,D5⓪)MOVE.L D0,(A4)+⓪ END⓪ END ApndD0_L;⓪ ⓪ (* hänge (D0.L).D im Code an *)⓪ PROCEDURE ApndD0I_D;⓪ BEGIN⓪ ASSEMBLER ADDQ #4,D5⓪)MOVE.L A0,-(A7)⓪)MOVE.L D0,A0⓪)MOVE.L (A0)+,(A4)+⓪)MOVE.L (A0) ,(A4)+⓪)MOVE.L (A7)+,A0⓪ END⓪ END ApndD0I_D ;⓪ ⓪ PROCEDURE TestType;⓪"BEGIN⓪"ASSEMBLER⓪)AND.W DataType,D3⓪)BEQ OK⓪)JMP AERR13 ;'ILLEGAL ADRESSING MODE'⓪"OK⓪"END⓪"END TestType;⓪ ⓪ ⓪ PROCEDURE TestTypeSource;⓪"BEGIN⓪"ASSEMBLER⓪)AND.W DataTypeSource,D3⓪)BEQ OK⓪)JMP AERR13 ;'ILLEGAL ADRESSING MODE'⓪"OK⓪"END⓪"END TestTypeSource;⓪ ⓪ ⓪ PROCEDURE TestTypeDest;⓪"BEGIN⓪"ASSEMBLER⓪)AND.W DataTypeDest,D3⓪)BEQ OK⓪)JMP AERR13 ;'ILLEGAL ADRESSING MODE'⓪"OK⓪"END⓪"END TestTypeDest;⓪ ⓪ ⓪ PROCEDURE TestTypeThird;⓪"BEGIN⓪"ASSEMBLER⓪)AND.W DataTypeThird,D3⓪)BEQ OK⓪)JMP AERR13 ;'ILLEGAL ADRESSING MODE'⓪"OK⓪"END⓪"END TestTypeThird;⓪ ⓪ ⓪ PROCEDURE CalcExpr; (* in D3 wird die Size des Datums in Byte uebergeben.⓪5* Wenn Bit 15 in D3 gesetzt, dann sind Labels unerlaubt⓪5* Wenn Bit 14 in D3 gesetzt, ist Wert vorzeichenbehaftet!⓪5* D3.B nicht verändern in dieser Routine ! *)⓪"BEGIN⓪"ASSEMBLER⓪+MOVE.W DataType,D0⓪+ANDI.W #1000010100000000%,D0 ; 8, 10 (lok. Lbl/Proc)⓪+BMI.W UNKNOWN⓪+BNE.W REL⓪ ⓪+MOVE.W DataType,D0⓪+ANDI.W #0001000000000000%,D0 ; 12⓪+BNE.W REALCONST⓪ ⓪+; konst. bekannter Wert⓪+MOVE.L Data,D0⓪ ⓪"C11 CMPI.B #1,D3⓪+BNE C10⓪ ⓪+BTST #14,D3⓪+BNE C112⓪ ⓪+CMPI.L #$100,D0⓪+BCS E3⓪+CMPI.L #$FFFFFF00,D0⓪+BHI E3⓪"AER16 JMP AERR16⓪ ⓪"C112 CMPI.L #$80,D0⓪+BCS E3⓪+CMPI.L #$FFFFFF80,D0⓪+BLS AER16⓪ ⓪"E3 ANDI.W #$FF,D0⓪+RTS⓪ ⓪"C10 CMPI.B #2,D3⓪+BNE E2⓪ ⓪+BTST #14,D3⓪+BNE C122⓪ ⓪+CMPI.L #$10000,D0⓪+BCS E2⓪+CMPI.L #$FFFF0000,D0⓪+BLS AER16⓪"E2 RTS⓪ ⓪"C122 CMPI.L #$8000,D0⓪+BCS E2⓪+CMPI.L #$FFFF8000,D0⓪+BLS AER16⓪+RTS⓪ ⓪ ⓪"REALCONST⓪+MOVE.L #Data,D0⓪+RTS⓪ ⓪ ⓪"REL ; PC-rel. Wert ( bekanntes Label / bekannte lok. PROC. )⓪+MOVE.L Data,D0⓪+ADD.L CodeStart,D0⓪+SUB.L pInstr,D0⓪+SUB.L D5,D0⓪+SUB.L D5,D0⓪ ⓪+ORI #$4000,D3⓪+BRA C11⓪ ⓪ ⓪"AER2 JMP AERR2⓪ ⓪"UNKNOWN ANDI.W #0111111111111111%,D0⓪+BNE RELPO⓪ ⓪+; absolute Verkettung ( glob. PROCEDURE / VAR / TABLE )⓪+CMPI.B #4,D3⓪+BNE AER2⓪+MOVE.L pInstr,D4⓪+SUB.L CodeStart,D4⓪+ADD.L D5,D4⓪+ADD.L D5,D4⓪+MOVE.L IDPtr,A0⓪+MOVE.L (A0),D0⓪+MOVE.L D4,(A0)⓪+RTS⓪"⓪"RELPO ; PC-rel. Verkettung⓪+TST.W D3⓪+BPL OK⓪+⓪+JSR PRTSTR⓪+DC.B $D⓪+ACZ 'Internal Error #1'⓪+SYNC⓪+BREAK ;interner ERROR: duerfte hier nicht mehr kommen⓪+⓪"OK MOVEA.L IDPtr,A0⓪+SUBQ.L #4,A0⓪+CMPI.B #1,D3⓪+BNE C2⓪"C1 SUBQ.L #4,A0 ;verw. Byte-^, wenn Size = 1 Byte⓪"⓪"C2 MOVE.L (A0),D0⓪+MOVE.L pInstr,(A0)⓪+ADD.L D5,(A0)⓪+ADD.L D5,(A0)⓪+CMPI.B #1,D3⓪+BNE C4⓪+ADDQ.L #1,(A0)⓪"⓪"C4 TST.L D0⓪+BEQ E0⓪+⓪+SUB.L pInstr,D0⓪+SUB.L D5,D0⓪+SUB.L D5,D0⓪+CMPI.B #1,D3⓪+BNE C5⓪+SUBQ.L #1,D0⓪+⓪"C5 ; Offset pruefen⓪+CMPI.B #1,D3⓪+BNE C3⓪+⓪+CMPI.L #$80,D0⓪+BCS E1⓪+CMPI.L #$FFFFFF80,D0⓪+BCC E1⓪+JMP AERR3⓪+⓪"C3 CMPI.L #$8000,D0⓪+BCS E0⓪+CMPI.L #$FFFF8000,D0⓪+BCC E0⓪+JMP AERR3⓪"⓪"E1 BCLR #7,D0 ;Merker setzen fuer Byte-^⓪+ANDI.W #$FF,D0⓪"E0 ANDI.L #$FFFF,D0 ;bei Word-^ oberes Wort f. DC.L/#.L loeschen⓪+RTS⓪"END⓪"END CalcExpr;⓪ ⓪ ⓪ (*⓪ * <ea> evtl. als Erweiterungswort an Code anhaengen⓪ *)⓪ PROCEDURE ApndEA;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.B Mode,D0⓪)BEQ JAER1 ;ERROR: Operand expected⓪)ANDI #$3F,D0 ; Doppelregs und Bitfields erstmal ignorieren⓪)CMPI.B #5,D0 ; d16,d24,(PC),#data ?⓪)BHI C1 ; ja ->⓪ ⓪ OK RTS ; OK, keine Erweiterungworte anzufuegen⓪ ⓪ C1 CMPI.B #13,D0 ; SR,CCR,USP,VBR,Reglist ?⓪)BCC OK ; ja -> OK⓪)CMPI.B #07,D0 ; 'd8(An,Rn.X)' / erw. 68020 Adr-Arten ?⓪)BEQ.L INDX⓪)CMPI.B #9,D0 ; 'd32' / 'd16' ?⓪)BEQ D32⓪)CMPI.B #11,D0 ; 'd8(PC,Rn.X)' ?⓪)BEQ.L INDX⓪)CMPI.B #12,D0 ; '#data' ?⓪)BEQ IMM⓪)CMPI.B #06,D0 ; 'd16(An)' ?⓪)BEQ D16IND⓪)CMPI.B #10,D0 ; 'd16(PC)' ?⓪)BEQ D16IND⓪)⓪)JSR PRTSTR⓪)DC.B $D⓪)ACZ 'Internal Error #2'⓪)SYNC⓪)BREAK ;interner ERROR: d16 aufgetreten⓪ ⓪ JAER1 JMP AERR1⓪ AER2 JMP AERR2⓪ ⓪ ; 'd32'⓪ D32 MOVE.W #$8004,D3⓪)JSR CalcExpr⓪ C6 JMP ApndD0_L⓪ C6P JMP ApndD0I_D⓪ ; '#data'⓪ IMM MOVE.B SizeOfData,D3⓪)BNE C4⓪)MOVEQ #DefltSiz,D3⓪ C4 ORI.W #$8000,D3 ; Ref. auf Label nicht erlaubt !⓪)JSR CalcExpr⓪)CMPI.B #4,D3 ; #.L ?⓪)BEQ C6⓪)CMPI.B #$10,D3 ; #.D ?⓪)BEQ C6P⓪)CMPI.B #$02,D3⓪)BHI AER2⓪)JMP ApndD0_W⓪ ⓪ ; 'd16(An)'⓪ D16IND MOVE.W #$4002,D3⓪)CMPI.B #10,D0 ; PC als Basereg. ?⓪)BEQ D16PC⓪)ORI #$8000,D3 ; Bei An als Basereg. rel. Adr. nicht zulassen⓪ D16PC JSR CalcExpr⓪)JMP ApndD0_W⓪ ⓪ GetXn CLR.W D0⓪)MOVE.B IndReg,D0 ; Nummer (n) des 'Rn'⓪)ROR.W #4,D0⓪)TST.B IndType ;'Rn': 'Dn' oder 'An' ?⓪)BNE C2⓪)BSET #15,D0 ;-> 'An'⓪ C2 CMPI.B #2,IndSize ;Size (X) des 'Rn.X'⓪)BEQ C3⓪)BSET #11,D0 ;-> 'Rn.L'⓪ C3 MOVE D0,-(A7)⓪); Scaling eintragen⓪)MOVE.B IndScale,D0⓪)SUBQ #1,D0⓪)BTST #1,D0⓪)BEQ C21⓪)BCLR #2,D0⓪)BNE C21⓪)BCLR #0,D0⓪ C21 LSL #8,D0⓪)LSL #1,D0⓪)OR (A7)+,D0⓪)RTS⓪ ⓪ ; 'd8(An,Rn.X)'⓪ INDX⓪ (*$ ? Asm20:⓪)BTST #FlgIs20,M20Flg⓪)BNE M20indx ; erw. Adr-Arten der 68020 auswerten⓪ *)⓪)BSR GetXn⓪)MOVE.W D0,-(A7)⓪)MOVE.W #$4001,D3⓪)MOVE.B Mode,D0⓪)ANDI #$3F,D0⓪)CMPI.B #11,D0 ; PC als Basereg. ?⓪)BEQ D8PC⓪)ORI #$8000,D3 ; Bei An als Basereg. rel. Adr. nicht zulassen⓪ D8PC JSR CalcExpr⓪)ANDI.W #$FF,D0⓪)OR.W (A7)+,D0⓪ ApW JMP ApndD0_W⓪ ⓪ (*$ ? Asm20:⓪ ⓪ ApndDisp ; bestimmt Size für Displacement (68020) und fügt an Code an⓪); vorher DataType und Data mit richtigen Daten laden !⓪); Default ist Long, nur bestimmte Datentypen werden als Wort behandelt⓪)⓪)MOVE DataType,D0⓪)BTST #12,D0⓪)BEQ KeinReal⓪)JMP AERR2⓪)⓪ KeinReal MOVEQ #4,D3⓪)BTST #2,D0 ; Num. Konstante ?⓪)BEQ TstTyp ; Nein⓪)⓪); Num. Konstante auf Größe untersuchen⓪)CMPI.L #$8000,Data⓪)BCS WordSize ; 0 <= Data < $8000⓪)CMPI.L #$FFFF8000,Data⓪)BCS LongSize ; Data < -$8000⓪)BRA WordSize⓪)⓪ TstTyp ANDI #011100111001%,D0⓪)BEQ LongSize⓪)⓪ WordSize MOVEQ #2,D3⓪ LongSize JSR CalcExpr⓪); D3 ist noch erhalten⓪)CMPI.B #2,D3⓪)BEQ ApW⓪)JMP ApndD0_L⓪)⓪)⓪ M20indx MOVE.L A4,-(A7) ; jetzige Code-Pos. merken f. Erw.-Wort⓪)ADDQ.L #2,A4 ; zunächst überspringen⓪)MOVE.W #0000000111010000%,D2 ; Default: all Operands suppressed⓪)BTST #FlgAnPC,M20Flg⓪)BEQ x0⓪)⓪); Base reg.⓪)BCLR #7,D2 ; Base reg. added⓪)⓪ x0 BTST #FlgXn,M20Flg⓪)BEQ x1⓪)⓪); Index reg.⓪)BSR GetXn⓪)BCLR #6,D2 ; Index reg. added⓪)OR D0,D2⓪)⓪ x1 BTST #FlgBd,M20Flg⓪)BEQ x2⓪)⓪); Base displacement⓪)BSR ApndDisp⓪)BSET #5,D2 ; Size = W or L⓪)CMPI.B #2,D3 ; bd Size ?⓪)BNE x2⓪)BCLR #4,D2 ; W-Size setzen⓪ ⓪ x2 BTST #FlgeKlA,M20Flg⓪)BEQ x3⓪)⓪); memory indirection⓪)⓪)BSET #0,D2 ; Default: No outer displacement⓪)⓪)BTST #FlgXn,M20Flg⓪)BEQ x21⓪)BTST #FlgPreIx,M20Flg⓪)BNE x21⓪)⓪)BSET #2,D2 ; Indirect Post-Indexed⓪)⓪ x21 BTST #FlgOd,M20Flg⓪)BEQ x3⓪)⓪); Outer displacement⓪)MOVE.L DataOd,Data⓪)MOVE DataTypeOd,DataType⓪)BSR ApndDisp⓪)BSET #1,D2 ; Size = W or L⓪)CMPI.B #2,D3 ; bd Size ?⓪)BNE x3⓪)BCLR #0,D2 ; W-Size setzen⓪)⓪ x3 MOVE.L (A7)+,A0 ; alte Code-Position zurückholen⓪)MOVE D2,(A0)⓪ *)⓪ END⓪ END ApndEA;⓪ ⓪ ⓪ (*⓪!* <ea> auf legale Adressierung pruefen⓪!* folg. Kombinationen sind auschließlich erlaubt:⓪!* (X:erlaubt, W:Word size, L:Long size, S:Size je nach Datengröße)⓪ ⓪(( 0) Const(Byte,Word)- L W W W W W W - X X X W-Konstante⓪(( 1) External - L L L L - X X X L-Konstante⓪(( 2) Numeric const. - L L W W S W S S - X X X X W-Konstante⓪(( 3) Char - L W W W W - X X W-Konstante⓪(( 4) Enum.Type - L W W W W - X X W-Konstante⓪(( 5) Record-Field - L W W W W - X X W-Konstante⓪(( 6) Glob.Var./Table - L L L L - X abs. Pointer⓪(( 7) Glob.Procedure - L L L L - X X abs. Pointer⓪(( 8) Label - W W W - X X X X rel. Pointer⓪(( 9) Lok.Variable - L W W W W - X X W-Konstante⓪((10) Lok.Procedure - W W W - X X X X rel. Pointer⓪((11) Const(Long) - L L L L L - X X L-Konstante⓪((12) Real - D - D-Konstante⓪?^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^⓪-d32 ------/ | | | | | | | | | | | | |⓪-#d32 --------/ | | | | | | | | | | | |⓪-#d16 / #d8 ----------/ | | | | | | | | | | |⓪-d8/d16(An.. ------------/ | | | | | | | | | |⓪&68020: bd - An --------------/ | | | | | | | | |⓪-d8/d16(PC.. ----------------/ | | | | | | | |⓪&68020: bd - PC ------------------/ | | | | | | |⓪&68020: od --------------------/ | | | | | |⓪&68881: #d64 ----------------------/ | | | | |⓪T| | | | |⓪-JMP / JSR --------------/ | | | |⓪-TRAP / STOP /LINK / BKPT ----------------/ | | |⓪-Bcc / DBcc / BSR ------------------/ | |⓪-DC.L / MOVE / LEA / PEA / TRAPcc # ----------/ |⓪-DC.W / DC.B ----------------------/⓪-TRAP / BKPT⓪-PACK / UNPK !!!⓪-TRAPcc !!!⓪!*⓪!* Regel : wenn d8(An/PC,Xn) erlaubt ist, dann sind auch erw. 68020⓪!* Adr-Arten (..,An/PC..) erlaubt und müssen geprüft werden⓪!*)⓪ PROCEDURE VerifyEA;⓪ BEGIN⓪ ASSEMBLER MOVE.B Mode,D0⓪)BEQ JAER1 ;ERROR: Operand expected⓪)⓪)CMPI.B #$3F,D0 ; Doppelregs und Bitfields müssen gelöscht sein⓪)BHI JAER1⓪)⓪)CMPI.B #2,D0 ;'An' ?⓪)BNE C1⓪)CMPI.B #1,SizeOfData ;'.B' ?⓪)BEQ AER2 ;ERROR: Byteverarb. bei Adr-Reg. nicht zugel.⓪)⓪ C1 CMPI.B #9,D0 ; 'd32' / 'd16' ?⓪)BEQ D32⓪)CMPI.B #06,D0 ; 'd16(An)' ?⓪)BEQ INDA⓪)CMPI.B #07,D0 ; 'd8(An,Rn.X)' ?⓪)BEQ INDA⓪)CMPI.B #10,D0 ; 'd16(PC)' ?⓪)BEQ INDPC⓪)CMPI.B #11,D0 ; 'd8(PC,Rn.X)' ?⓪)BEQ INDPC⓪)CMPI.B #12,D0 ; '#data' ?⓪)BEQ IMM⓪)RTS⓪ ⓪ JAER1 JMP AERR1⓪ AER2 JMP AERR2⓪ ⓪ ; 'd16(An)' / 'd8(An,Rn.X)' / erw. 68020 Adr-Arten mit An als Baseregister⓪ INDA MOVE.W #1110111001010%,D3⓪)BTST #FlgIs20,M20Flg ; erw. Adr-Art ?⓪)BEQ IndA2 ; Nein -> Test f. d8/d16(An.. ausführen⓪)MOVE.W #1010100000000%,D3 ; bd testen, od braucht nicht !⓪ IndA2 JMP TestType⓪ ⓪ ; 'd16(PC)' / 'd8(PC,Rn.X)' / erw. 68020 Adr-Arten mit PC als Baseregister⓪ INDPC MOVE.W #1101011111010%,D3⓪)BTST #FlgIs20,M20Flg ; erw. Adr-Art ?⓪)BEQ IndPC2 ; Nein -> Test f. d8/d16(PC.. ausführen⓪)MOVE.W #1001011110010%,D3 ; bd testen, od braucht nicht !⓪ IndPC2 JMP TestType⓪ ⓪ ; 'd32'⓪ D32 MOVE.W #1011100111001%,D3⓪)JMP TestType⓪ ⓪ ; '#data'⓪ IMM MOVE.B SizeOfData,D3⓪)BNE IMMC2⓪)MOVEQ #DefltSiz,D3⓪ IMMC2 CMPI.B #1,D3⓪)BEQ IMMC1⓪)CMPI.B #2,D3⓪)BEQ IMMC1⓪)CMPI.B #$10,D3⓪)BEQ IMMC3⓪)CMPI.B #4,D3⓪)BNE AER2⓪)MOVE.W #1010100000000%,D3⓪)JMP TestType⓪ IMMC1 MOVE.W #1110111000010%,D3⓪)JMP TestType⓪ IMMC3 MOVE.W #0111111111111%,D3⓪)JMP TestType⓪ END⓪ END VerifyEA;⓪ ⓪ ⓪ PROCEDURE ApndSource;⓪ BEGIN⓪ ASSEMBLER JSR SourceToLast⓪)JSR VerifyEA⓪)JMP ApndEA⓪ END⓪ END ApndSource;⓪ ⓪ ⓪ PROCEDURE ApndDest;⓪ BEGIN⓪ ASSEMBLER JSR DestToLast⓪)JSR VerifyEA⓪)JMP ApndEA⓪ END⓪ END ApndDest;⓪ ⓪ ⓪ PROCEDURE ApndThird;⓪ BEGIN⓪ ASSEMBLER JSR ThirdToLast⓪)JSR VerifyEA⓪)JMP ApndEA⓪ END⓪ END ApndThird;⓪ ⓪ ⓪ PROCEDURE SourceTo0_5;⓪ BEGIN⓪ ASSEMBLER JSR SourceToLast⓪+JSR EATo0_5⓪+JMP LastToSource⓪ END⓪ END SourceTo0_5;⓪ ⓪ ⓪ PROCEDURE DestTo0_5;⓪ BEGIN⓪ ASSEMBLER JSR DestToLast⓪+JSR EATo0_5⓪+JMP LastToDest⓪ END⓪ END DestTo0_5;⓪ ⓪ ⓪ PROCEDURE ThirdTo0_5;⓪ BEGIN⓪ ASSEMBLER JSR ThirdToLast⓪+JSR EATo0_5⓪+JMP LastToThird⓪ END⓪ END ThirdTo0_5;⓪ ⓪ ⓪ (*⓪ * '#data' als 'd3' nach Bit 9-11 ( v. ADDQ / SUBQ / ASL / ROL / LSL usw. )⓪ *)⓪ PROCEDURE d3To9_11;⓪ BEGIN⓪ ASSEMBLER MOVE.W #1111111001010%,D3⓪)JSR TestTypeSource⓪)MOVE.L DataSource,D0⓪)CMPI.L #9,D0⓪)BCS OK⓪)JMP AERR2⓪ !OK ANDI.B #$7,D0⓪)LSL #3,D0⓪)LSL #6,D0⓪)OR D0,D1⓪ END⓪ END d3To9_11;⓪ ⓪ ⓪ PROCEDURE CheckModeSource;⓪ BEGIN⓪ ASSEMBLER ; In D0.L müssen alle zugelassenen Modes als Bits übergeben werden⓪)MOVE D2,-(A7)⓪)MOVE.B modeSource,D2⓪)BEQ AER1⓪)BTST D2,D0⓪)BNE ok⓪ AER1 JMP AERR1⓪ ok MOVE (A7)+,D2⓪ END⓪ END CheckModeSource;⓪ ⓪ ⓪ PROCEDURE CheckModeDest;⓪ BEGIN⓪ ASSEMBLER ; In D0.L müssen alle zugelassenen Modes als Bits übergeben werden⓪)MOVE D2,-(A7)⓪)MOVE.B modeDest,D2⓪)BEQ AER1⓪)BTST D2,D0⓪)BNE ok⓪ AER1 JMP AERR1⓪ ok MOVE (A7)+,D2⓪ END⓪ END CheckModeDest;⓪ ⓪ ⓪ PROCEDURE CheckModeThird;⓪ BEGIN⓪ ASSEMBLER ; In D0.L müssen alle zugelassenen Modes als Bits übergeben werden⓪)MOVE D2,-(A7)⓪)MOVE.B modeThird,D2⓪)BEQ AER1⓪)BTST D2,D0⓪)BNE ok⓪ AER1 JMP AERR1⓪ ok MOVE (A7)+,D2⓪ END⓪ END CheckModeThird;⓪ ⓪ ⓪ PROCEDURE ErrOnOddAdr;⓪"BEGIN⓪"ASSEMBLER⓪+MOVE.W A4,D0⓪+BTST #0,D0⓪+BEQ OK⓪+JMP AERR9⓪"OK⓪"END⓪"END ErrOnOddAdr;⓪ ⓪ ⓪ FORWARD ASSM;⓪ ⓪ PROCEDURE NextLine;⓪"BEGIN⓪"ASSEMBLER⓪+JSR AsmSameSbl⓪+CMPI.W #35,D3⓪+BEQ L1⓪+TST AsmMode ;Assembler-Option noch Aktiv ?⓪+BEQ L1 ;nein: SYNC und RTS⓪+JMP ASSM ;Ja:naechstes Symbol auswerten⓪"!L1 SF DoingAsm⓪+JSR ErrOnOddAdr⓪+JMP AsmSameSbl⓪"END⓪"END NextLine;⓪ ⓪ ⓪ ⓪ (*⓪ * PSEUDO OPCODE⓪ *)⓪ PROCEDURE PseudoOp;⓪ BEGIN⓪ ASSEMBLER⓪)CLR.L D5⓪)CMPI.W #AS165,D3⓪)BEQ.L MNBOMB⓪)CMPI.W #AS157,D3⓪)BEQ DCOP ;%DC⓪)CMPI.W #AS158,D3⓪)BEQ DSOP ;%DS⓪);CMPI.W #AS160,D3⓪);BEQ.L AEQU ;%EQU⓪)CMPI.W #AS161,D3⓪)BEQ.L AACZ ;%ACZ⓪)CMPI.W #AS162,D3⓪)BEQ.L ASYNC ;%SYNC⓪)CMPI.W #AS163,D3⓪)BEQ.L AASC ;%ASC⓪);CMPI.W #AS164,D3⓪);BEQ.L AACI ;%ACI⓪)CMPI.W #AS_STR,D3⓪)BEQ.L ASTR ;%STR⓪ AER4 JMP AERR4⓪ AER2 JMP AERR2⓪ AER7 JMP AERR7⓪ AER18 JMP AERR18 ; String too long⓪ ⓪ !DSOP JSR AsmGetSbl⓪)JSR GetExpr⓪)MOVE.W DataType,D0⓪)BMI AER7⓪)ANDI.W #1001000100101%,D0⓪)BEQ AER7⓪)MOVE.L Data,D0⓪)CMPI.L #$FFFF,D0⓪)BHI AER2⓪)BRA DSL1⓪ DSL0 CLR.B (A4)+⓪ DSL1 DBRA D0,DSL0⓪)JMP NEXTLINE⓪ ⓪ !DCOP JSR AsmGetSbl⓪)CMP.W #AS37,D3 ;'.'?⓪)BEQ OK4⓪)JMP AERR2⓪ !OK4 JSR FETNOSP⓪)ANDI.W #$DF,D2 ;KLEINSCHRIFT WEG⓪)CMP.W #'D',D2⓪)BEQ.L DCD⓪)CMP.W #'L',D2⓪)BEQ.L DCL⓪)CMP.W #'W',D2⓪)BEQ DCW⓪)CMP.W #'B',D2⓪)BNE AER4⓪ ⓪ !DCB MOVE.L A4,pInstr⓪)CLR D5⓪)JSR AsmGetSbl⓪)JSR GetExpr⓪)MOVE.W DataType,D3⓪)BTST #12,D3⓪)BNE AER2⓪)MOVEQ #1,D3⓪)JSR CalcExpr⓪)MOVE.B D0,(A4)+⓪)JSR AsmSameSbl⓪)CMPI.W #AS38,D3⓪)BEQ DCB ;DC.B⓪)JMP NextLine⓪ ⓪ DCW JSR ErrOnOddAdr⓪)MOVE.L A4,pInstr⓪)CLR D5⓪)JSR AsmGetSbl⓪)JSR GetExpr⓪)MOVE.W DataType,D3⓪)BTST #12,D3⓪)BNE AER2⓪)MOVEQ #2,D3⓪)JSR CalcExpr⓪)MOVE.W D0,(A4)+⓪)JSR AsmSameSbl⓪)CMPI.W #AS38,D3⓪)BEQ DCW ;DC.W⓪)JMP NextLine⓪ ⓪ DCL JSR ErrOnOddAdr ; DC.L⓪)MOVE.L A4,pInstr⓪)CLR D5⓪)JSR AsmGetSbl⓪)JSR GetExpr⓪)MOVE.W DataType,D3⓪)BTST #12,D3⓪)BNE AER2⓪)MOVEQ #4,D3⓪)JSR CalcExpr⓪)MOVE.L D0,(A4)+⓪)JSR AsmSameSbl⓪)CMPI.W #AS38,D3⓪)BEQ DCL⓪)JMP NextLine⓪ ⓪ DCD JSR ErrOnOddAdr ; DC.D⓪)MOVE.L A4,pInstr⓪)CLR D5⓪)JSR AsmGetSbl⓪)JSR GetExpr⓪)MOVE.W DataType,D3⓪)BTST #12,D3⓪)BEQ.L AER2⓪)MOVEQ #$10,D3⓪)JSR CalcExpr⓪)MOVE.L A0,-(A7)⓪)MOVE.L D0,A0⓪)MOVE.L (A0)+,(A4)+⓪)MOVE.L (A0) ,(A4)+⓪)MOVE.L (A7)+,A0⓪)JSR AsmSameSbl⓪)CMPI.W #AS38,D3⓪)BEQ DCD⓪)JMP NextLine⓪ ⓪ AACZ BSR GENSTR ; ACZ⓪)CLR.B (A4)+⓪)CMPI.W #AS38,D3 ; ','⓪)BEQ AACZ⓪)JMP NextLine⓪)⓪ ASYNC JSR AsmGetSbl⓪)JSR PUT0⓪)JMP NextLine⓪ ⓪ AASC BSR GENSTR⓪)CMPI.W #AS38,D3 ; ','⓪)BEQ AASC⓪)JMP NextLine⓪ ⓪ ASTR ADDQ.L #1,A4⓪)MOVE.L A4,-(A7)⓪ ASTR2 BSR GENSTR⓪)CMPI.W #AS38,D3 ; ','⓪)BEQ ASTR2⓪)MOVE.L A4,D0⓪)SUB.L (A7),D0⓪)CMPI.L #255,D0⓪)BHI AER18 ; String too long⓪)MOVE.L (A7)+,A0⓪)MOVE.B D0,-1(A0)⓪)JMP NextLine⓪)⓪ GENSTR JSR AsmGetSbl⓪)CMPI.W #STRCONST,D3⓪)BNE GenStr2⓪ GenStr0 MOVE StrLen,D0⓪)LEA STRBUF,A0⓪)BRA GenSt⓪ GENLP MOVE.B (A0)+,(A4)+⓪ GenSt DBRA D0,GenLp⓪)JMP AsmGetSbl⓪ GenStr2 JSR ConFact⓪)MOVE.W -2(A1,D2.L),D3⓪)CMPI.B #3,D3 ; CHAR⓪)BEQ GenStrS1⓪)CMPI.B #18,D3 ; Alte Const⓪)BEQ GenStrS1⓪)CMPI.B #50,D3 ; Neue Const⓪)BEQ GenStrS1⓪)CMPI.B #27,D3 ; String-Const⓪)BEQ GenStr0⓪)CMPI.B #31,D3 ; String-Const⓪)BEQ GenStr0⓪)BRA AER4⓪ GenStrS1 MOVE.L Accu,D0⓪)CMPI.L #$FF,D0⓪)BHI AER6⓪)MOVE.B D0,(A4)+⓪)JMP AsmGetSbl⓪ AER6 JMP AERR6⓪ ⓪ !MNBOMB JSR AsmGetSbl⓪)JSR GetEA⓪)TST.B Mode⓪)BEQ AER1⓪)CMPI #AS38,D3 ; ','⓪)BEQ AER1⓪)JSR PRTSTR⓪)DC.B 37,7,7,13,10⓪)ACZ '<BOMB>: qualified user expected!'⓪)SYNC⓪)BRA AER4⓪ ⓪ AER1 JMP AERR1⓪ END⓪ END PseudoOp;⓪ ⓪ ⓪ (*⓪ * LABEL DEKLARATION, ALLE VORWAERTSREFERENZEN EINTRAGEN⓪ *)⓪ PROCEDURE LabelDecl;⓪ BEGIN⓪ ASSEMBLER⓪)TST.L -6(A1,D2.L)⓪)BEQ OK⓪)JMP AERR12 ;Label bereits declariert⓪ !OK MOVE.L pInstr,-6(A1,D2.L) ;Adr.d.Labels⓪)MOVE.L CodeStart,D0⓪)SUB.L D0,-6(A1,D2.L) ;Rel.Adr. eintragen⓪)⓪)MOVE.L -10(A1,D2.L),A0 ;^ auf Word-Offset-Kette⓪)CMPA.L #0,A0⓪)BEQ E0⓪)⓪ L1 MOVE.W (A0),D0⓪)MOVE.L pInstr,D1⓪)SUB.L A0,D1⓪)CMPI.L #$8000,D1⓪)BCS C1⓪)CMPI.L #$FFFF8000,D1⓪)BCC C1⓪)JMP AERR3 ;ERROR:'Branch too long'⓪ C1 MOVE.W D1,(A0)⓪)⓪)ADDA.W D0,A0⓪)TST.W D0⓪)BNE L1⓪)⓪ E0 MOVE.L -14(A1,D2.L),A0 ;^ auf Byte-Offset-Kette⓪)CMPA.L #0,A0⓪)BEQ E1⓪)⓪ L2 MOVE.B (A0),D0⓪)MOVE.L pInstr,D1⓪)SUB.L A0,D1⓪)⓪)BTST #7,D0 ;Ist Bit 7 im Verkettungs-^ gesetzt ?⓪)BEQ C3⓪)⓪)SUBQ.L #1,D1 ;ja:'Bcc',Displacement wieder um 1 erniedrigen⓪)BNE C4 ;Offset # 0 : OK⓪)⓪)JMP AERR11 ;ERROR: 'Bcc.S' mit Offset = 0⓪ ⓪ C3 ADDQ.L #1,D1 ;nein: Displacement noch um 1 erhoehen⓪ ⓪ C4 CMPI.L #$80,D1⓪)BCS C2⓪)CMPI.L #$FFFFFF80,D1⓪)BCC C2⓪)JMP AERR3 ;ERROR:'Branch too long'⓪ C2 MOVE.B D1,(A0)⓪)⓪)ORI.B #$80,D0⓪)EXT.W D0⓪)ADDA.W D0,A0⓪)ANDI.B #$7F,D0⓪)TST.B D0⓪)BNE L2⓪ ⓪ E1⓪ END⓪ END LabelDecl;⓪ ⓪ ⓪ (*⓪ * ID DEFINITION⓪ *)⓪ PROCEDURE LABELEXP;⓪ BEGIN⓪ ASSEMBLER⓪)JSR AsmSameSbl⓪)TST.W D3 ; TEST NOCHMAL,OB AUF SYMBOL REFERIERT⓪)BEQ ZERO ; NEIN:SYMBOL NOCH UNBEKANNT⓪)BPL AER10 ; MODULA-WORT ->⓪)CMPI #LabelID,D3⓪)BNE ZERO⓪)JSR LabelDecl ; ID BEREITS BEKANNT -> FORWARD REF.⓪)BRA c0⓪ ⓪ !AER10 JMP AERR10⓪ ⓪ !ZERO JSR NewLabel⓪)MOVE.L pInstr,-6(A1,D2.L) ; akt. Adr. dem Label zuweisen⓪)MOVE.L CodeStart,D0⓪)SUB.L D0,-6(A1,D2.L) ;Rel.Adr. eintragen⓪ c0 CMPI.B #':',(A2)⓪)BNE c1⓪)ADDQ.L #1,A2 ; Ja -> überspringen⓪ c1 JSR AsmGetSbl⓪)JMP NextLine⓪ END⓪ END LABELEXP;⓪ ⓪ ⓪ PROCEDURE MneCodeTab;⓪ BEGIN⓪ ASSEMBLER DC.L 1100000100000000%⓪)DC.L 1000000100000000%⓪)DC.L 1101000100000000%⓪)DC.L 1001000100000000%⓪)DC.L 1101000000000000%⓪)DC.L 1100000000000000%⓪)DC.L 1000000000000000%⓪)DC.L 1001000000000000%⓪)DC.L 1101000000000000%⓪)DC.L 1011000000000000%⓪)DC.L 1001000000000000%⓪)DC.L 0000000001000000%⓪)DC.L 0000011000000000%⓪)DC.L 0000110000000000%⓪)DC.L 0000010000000000%⓪)DC.L 0000001000000000%⓪)DC.L 0000101000000000%⓪)DC.L 0000000000000000%⓪)DC.L 0101000000000000%⓪)DC.L 0101000100000000%⓪)DC.L 1110000100000000% ;%ASL⓪)DC.L 1110000000000000% ;%ASR⓪)DC.L 1110001100001000% ;%LSL⓪)DC.L 1110001000001000% ;%LSR⓪)DC.L 1110011100011000% ;%ROL⓪)DC.L 1110011000011000% ;%ROR⓪)DC.L 1110010100010000% ;%ROXL⓪)DC.L 1110010000010000% ;%ROXR⓪)DC.L 0110010000000000%⓪)DC.L 0110010100000000%⓪)DC.L 0110011100000000%⓪)DC.L 0110110000000000%⓪)DC.L 0110111000000000%⓪)DC.L 0110001000000000%⓪)DC.L 0110111100000000%⓪)DC.L 0110001100000000%⓪)DC.L 0110110100000000%⓪)DC.L 0110101100000000%⓪)DC.L 0110011000000000%⓪)DC.L 0110101000000000%⓪)DC.L 0110100000000000%⓪)DC.L 0110100100000000%⓪)DC.L 0110000000000000%⓪)DC.L 0110000100000000%⓪)DC.L 0000000101000000%⓪)DC.L 0000000110000000%⓪)DC.L 0000000111000000%⓪)DC.L 0000000100000000%⓪)DC.L 0100000110000000%⓪)DC.L 1100000111000000%⓪)DC.L 1100000011000000%⓪)DC.L 1000000111000000%⓪)DC.L 1000000011000000%⓪)DC.L 0100001000000000%⓪)DC.L 0100010000000000%⓪)DC.L 0100000000000000%⓪)DC.L 0100011000000000%⓪)DC.L 0100101000000000%⓪)DC.L 1011000000000000%⓪)DC.L 1011000100001000%⓪)DC.L 0101010011001000% ;%DBCC⓪)DC.L 0101010111001000%⓪)DC.L 0101011111001000%⓪)DC.L 0101000111001000% ;%DBF⓪)DC.L 0101000111001000%⓪)DC.L 0101110011001000%⓪)DC.L 0101111011001000%⓪)DC.L 0101001011001000%⓪)DC.L 0101111011001000%⓪)DC.L 0101001111001000%⓪)DC.L 0101110111001000%⓪)DC.L 0101101111001000%⓪)DC.L 0101011011001000%⓪)DC.L 0101101011001000%⓪)DC.L 0101000011001000%⓪)DC.L 0101100011001000%⓪)DC.L 0101100111001000%⓪)DC.L 1011000000000000%⓪)DC.L 1100000100000000%⓪)DC.L 0100100010000000% ;%EXT⓪)DC.L 0100111011000000%⓪)DC.L 0100111010000000%⓪)DC.L 0100100001000000%⓪)DC.L 0100000111000000%⓪)DC.L 0100111001010000%⓪)DC.L 0000000000000000%⓪)DC.L 0100100010000000%⓪)DC.L 0000000000001000%⓪)DC.L 0111000000000000%⓪)DC.L 0100100000000000%⓪)DC.L 0101010011000000%⓪)DC.L 0101010111000000%⓪)DC.L 0101011111000000%⓪)DC.L 0101000111000000%⓪)DC.L 0101110011000000%⓪)DC.L 0101111011000000%⓪)DC.L 0101001011000000%⓪)DC.L 0101111111000000%⓪)DC.L 0101001111000000%⓪)DC.L 0101110111000000%⓪)DC.L 0101101111000000%⓪)DC.L 0101011011000000%⓪)DC.L 0101101011000000%⓪)DC.L 0101000011000000%⓪)DC.L 0101100011000000%⓪)DC.L 0101100111000000%⓪)DC.L 0100101011000000%⓪)DC.L 0100111001110001%⓪)DC.L 0100111001110011%⓪)DC.L 0100111001110101% ;%RTS⓪)DC.L 0100111001110110%⓪)DC.L 0100111001110000%⓪)DC.L 0100111001110010%⓪)DC.L 0100100001000000%⓪)DC.L 0100111001000000%⓪)DC.L 0100111001011000%⓪)DC.L 0100111001110111%⓪)DC.L 0101000111001000% ;%DBRA (DBF)⓪)DC.L $4AFC ;%ILLEGAL⓪)DC.L $4AFC ;%BREAK⓪)DC.L $4E7A ;%MOVEC⓪)DC.L $4E74 ;%RTD⓪)⓪ (*$ ? Asm20:⓪); Erweiterungen seit 3.3a / 1.8.86 f. 68020⓪)DC.L 1110101011000000% ;%BFCHG⓪)DC.L 1110110011000000% ;%BFCLR⓪)DC.L 1110101111000000% ;%BFEXTS⓪)DC.L 1110100111000000% ;%BFEXTU⓪)DC.L 1110110111000000% ;%BFFFO⓪)DC.L 1110111111000000% ;%BFINS⓪)DC.L 1110111011000000% ;%BFSET⓪)DC.L 1110100011000000% ;%BFTST⓪)DC.L 0100100001001000% ;%BKPT⓪)DC.L 0000011011000000% ;%CALLM⓪)DC.L 0000100011000000% ;%CAS⓪)DC.L 0000100011111100% ;%CAS2⓪)DC.L 0000000011000000% ;%CHK2⓪)DC.L 0000000011000000% ;%CMP2⓪)DC.L 1000000111000000% ;%DIVSL Worte für DIVS.W bzw DIVU.W⓪)DC.L 1000000011000000% ;%DIVUL da in Mn-routien umgesetzt⓪'; DC.L 0100110001000000% ;%DIVSL ???⓪'; DC.L 0100110001000000% ;%DIVUL ???⓪)DC.L 0100100111000000% ;%EXTB⓪)DC.L 0000111000000000% ;%MOVES⓪)DC.L 1000000101000000% ;%PACK⓪)DC.L 0000011011000000% ;%RTM⓪)DC.L 0101010011111000% ;%TRAPCC⓪)DC.L 0101010111111000% ;%TRAPCS⓪)DC.L 0101011111111000% ;%TRAPEQ⓪)DC.L 0101000111111000% ;%TRAPF⓪)DC.L 0101110011111000% ;%TRAPGE⓪)DC.L 0101111011111000% ;%TRAPGT⓪)DC.L 0101001011111000% ;%TRAPHI⓪)DC.L 0101111111111000% ;%TRAPLE⓪)DC.L 0101001111111000% ;%TRAPLS⓪)DC.L 0101110111111000% ;%TRAPLT⓪)DC.L 0101101111111000% ;%TRAPMI⓪)DC.L 0101011011111000% ;%TRAPNE⓪)DC.L 0101101011111000% ;%TRAPPL⓪)DC.L 0101000011111000% ;%TRAPT⓪)DC.L 0101100011111000% ;%TRAPVC⓪)DC.L 0101100111111000% ;%TRAPVS⓪)DC.L 1000000110000000% ;%UNPK⓪)⓪); Erweiterung für 68881⓪)DC.L 00000000000000001111001000000000% ;%FMOVE⓪)DC.L 01011100000000001111001000000000% ;%FMOVECR⓪)DC.L 10000000000000001111001000000000% ;%FMOVEM⓪)DC.L 00000000000000001111001101000000% ;%FRESTORE⓪)DC.L 00000000000000001111001100000000% ;%FSAVE⓪)DC.L 00000000000000001111001010000000% ;%FNOP⓪)DC.L 00000000001110101111001000000000% ;%FTST⓪)DC.L 00000000000000001111001010000001% ;%FBEQ⓪)DC.L 00000000000000001111001010000000% ;%FBF⓪)DC.L 00000000000000001111001010010011% ;%FBGE⓪)DC.L 00000000000000001111001010010110% ;%FBGL⓪)DC.L 00000000000000001111001010010111% ;%FBGLE⓪)DC.L 00000000000000001111001010010010% ;%FBGT⓪)DC.L 00000000000000001111001010010101% ;%FBLE⓪)DC.L 00000000000000001111001010010100% ;%FBLT⓪)DC.L 00000000000000001111001010001110% ;%FBNE⓪)DC.L 00000000000000001111001010011100% ;%FBNGE⓪)DC.L 00000000000000001111001010011001% ;%FBNGL⓪)DC.L 00000000000000001111001010011000% ;%FBNGLE⓪)DC.L 00000000000000001111001010011101% ;%FBNGT⓪)DC.L 00000000000000001111001010011010% ;%FBNLE⓪)DC.L 00000000000000001111001010011011% ;%FBNLT⓪)DC.L 00000000000000001111001010010001% ;%FBSEQ⓪)DC.L 00000000000000001111001010010000% ;%FBSF⓪)DC.L 00000000000000001111001010011110% ;%FBSNE⓪)DC.L 00000000000000001111001010011111% ;%FBST⓪)DC.L 00000000000000001111001010000011% ;%FBOGE⓪)DC.L 00000000000000001111001010000110% ;%FBOGL⓪)DC.L 00000000000000001111001010000010% ;%FBOGT⓪)DC.L 00000000000000001111001010000101% ;%FBOLE⓪)DC.L 00000000000000001111001010000100% ;%FBOLT⓪)DC.L 00000000000000001111001010000111% ;%FBOR⓪)DC.L 00000000000000001111001010001111% ;%FBT⓪)DC.L 00000000000000001111001010001011% ;%FBUGE⓪)DC.L 00000000000000001111001010001001% ;%FBUEQ⓪)DC.L 00000000000000001111001010001000% ;%FBUN⓪)DC.L 00000000000000001111001010001010% ;%FBUGT⓪)DC.L 00000000000000001111001010001101% ;%FBULE⓪)DC.L 00000000000000001111001010001100% ;%FBULT⓪)DC.L 00000000000000011111001001001000% ;%FDBEQ⓪)DC.L 00000000000000001111001001001000% ;%FDBF⓪)DC.L 00000000000100111111001001001000% ;%FDBGE⓪)DC.L 00000000000101101111001001001000% ;%FDBGL⓪)DC.L 00000000000101111111001001001000% ;%FDBGLE⓪)DC.L 00000000000100101111001001001000% ;%FDBGT⓪)DC.L 00000000000101011111001001001000% ;%FDBLE⓪)DC.L 00000000000101001111001001001000% ;%FDBLT⓪)DC.L 00000000000011101111001001001000% ;%FDBNE⓪)DC.L 00000000000111001111001001001000% ;%FDBNGE⓪)DC.L 00000000000110011111001001001000% ;%FDBNGL⓪)DC.L 00000000000110001111001001001000% ;%FDBNGLE⓪)DC.L 00000000000111011111001001001000% ;%FDBNGT⓪)DC.L 00000000000110101111001001001000% ;%FDBNLE⓪)DC.L 00000000000110111111001001001000% ;%FDBNLT⓪)DC.L 00000000000100011111001001001000% ;%FDBSEQ⓪)DC.L 00000000000100001111001001001000% ;%FDBSF⓪)DC.L 00000000000111101111001001001000% ;%FDBSNE⓪)DC.L 00000000000111111111001001001000% ;%FDBST⓪)DC.L 00000000000000111111001001001000% ;%FDBOGE⓪)DC.L 00000000000001101111001001001000% ;%FDBOGL⓪)DC.L 00000000000000101111001001001000% ;%FDBOGT⓪)DC.L 00000000000001011111001001001000% ;%FDBOLE⓪)DC.L 00000000000001001111001001001000% ;%FDBOLT⓪)DC.L 00000000000001111111001001001000% ;%FDBOR⓪)DC.L 00000000000011111111001001001000% ;%FDBT⓪)DC.L 00000000000010111111001001001000% ;%FDBUGE⓪)DC.L 00000000000010011111001001001000% ;%FDBUEQ⓪)DC.L 00000000000010001111001001001000% ;%FDBUN⓪)DC.L 00000000000010101111001001001000% ;%FDBUGT⓪)DC.L 00000000000011011111001001001000% ;%FDBULE⓪)DC.L 00000000000011001111001001001000% ;%FDBULT⓪)DC.L 00000000000000011111001001000000% ;%FSEQ⓪)DC.L 00000000000000001111001001000000% ;%FSF⓪)DC.L 00000000000100111111001001000000% ;%FSGE⓪)DC.L 00000000000101101111001001000000% ;%FSGL⓪)DC.L 00000000000101111111001001000000% ;%FSGLE⓪)DC.L 00000000000100101111001001000000% ;%FSGT⓪)DC.L 00000000000101011111001001000000% ;%FSLE⓪)DC.L 00000000000101001111001001000000% ;%FSLT⓪)DC.L 00000000000011101111001001000000% ;%FSNE⓪)DC.L 00000000000111001111001001000000% ;%FSNGE⓪)DC.L 00000000000110011111001001000000% ;%FSNGL⓪)DC.L 00000000000110001111001001000000% ;%FSNGLE⓪)DC.L 00000000000111011111001001000000% ;%FSNGT⓪)DC.L 00000000000110101111001001000000% ;%FSNLE⓪)DC.L 00000000000110111111001001000000% ;%FSNLT⓪)DC.L 00000000000100011111001001000000% ;%FSSEQ⓪)DC.L 00000000000100001111001001000000% ;%FSSF⓪)DC.L 00000000000111101111001001000000% ;%FSSNE⓪)DC.L 00000000000111111111001001000000% ;%FSST⓪)DC.L 00000000000000111111001001000000% ;%FSOGE⓪)DC.L 00000000000001101111001001000000% ;%FSOGL⓪)DC.L 00000000000000101111001001000000% ;%FSOGT⓪)DC.L 00000000000001011111001001000000% ;%FSOLE⓪)DC.L 00000000000001001111001001000000% ;%FSOLT⓪)DC.L 00000000000001111111001001000000% ;%FSOR⓪)DC.L 00000000000011111111001001000000% ;%FST⓪)DC.L 00000000000010111111001001000000% ;%FSUGE⓪)DC.L 00000000000010011111001001000000% ;%FSUEQ⓪)DC.L 00000000000010001111001001000000% ;%FSUN⓪)DC.L 00000000000010101111001001000000% ;%FSUGT⓪)DC.L 00000000000011011111001001000000% ;%FSULE⓪)DC.L 00000000000011001111001001000000% ;%FSULT⓪)DC.L 00000000000000011111001001111000% ;%FTRAPEQ⓪)DC.L 00000000000000001111001001111000% ;%FTRAPF⓪)DC.L 00000000000100111111001001111000% ;%FTRAPGE⓪)DC.L 00000000000101101111001001111000% ;%FTRAPGL⓪)DC.L 00000000000101111111001001111000% ;%FTRAPGLE⓪)DC.L 00000000000100101111001001111000% ;%FTRAPGT⓪)DC.L 00000000000101011111001001111000% ;%FTRAPLE⓪)DC.L 00000000000101001111001001111000% ;%FTRAPLT⓪)DC.L 00000000000011101111001001111000% ;%FTRAPNE⓪)DC.L 00000000000111001111001001111000% ;%FTRAPNGE⓪)DC.L 00000000000110011111001001111000% ;%FTRAPNGL⓪)DC.L 00000000000110001111001001111000% ;%FTRAPNGLE⓪)DC.L 00000000000111011111001001111000% ;%FTRAPNGT⓪)DC.L 00000000000110101111001001111000% ;%FTRAPNLE⓪)DC.L 00000000000110111111001001111000% ;%FTRAPNLT⓪)DC.L 00000000000100011111001001111000% ;%FTRAPSEQ⓪)DC.L 00000000000100001111001001111000% ;%FTRAPSF⓪)DC.L 00000000000111101111001001111000% ;%FTRAPSNE⓪)DC.L 00000000000111111111001001111000% ;%FTRAPST⓪)DC.L 00000000000000111111001001111000% ;%FTRAPOGE⓪)DC.L 00000000000001101111001001111000% ;%FTRAPOGL⓪)DC.L 00000000000000101111001001111000% ;%FTRAPOGT⓪)DC.L 00000000000001011111001001111000% ;%FTRAPOLE⓪)DC.L 00000000000001001111001001111000% ;%FTRAPOLT⓪)DC.L 00000000000001111111001001111000% ;%FTRAPOR⓪)DC.L 00000000000011111111001001111000% ;%FTRAPT⓪)DC.L 00000000000010111111001001111000% ;%FTRAPUGE⓪)DC.L 00000000000010011111001001111000% ;%FTRAPUEQ⓪)DC.L 00000000000010001111001001111000% ;%FTRAPUN⓪)DC.L 00000000000010101111001001111000% ;%FTRAPUGT⓪)DC.L 00000000000011011111001001111000% ;%FTRAPULE⓪)DC.L 00000000000011001111001001111000% ;%FTRAPULT⓪)DC.L 00000000001000101111001000000000% ;%FADD⓪)DC.L 00000000001110001111001000000000% ;%FCMP⓪)DC.L 00000000001000001111001000000000% ;%FDIV⓪)DC.L 00000000001000011111001000000000% ;%FMOD⓪)DC.L 00000000001000111111001000000000% ;%FMUL⓪)DC.L 00000000001001011111001000000000% ;%FREM⓪)DC.L 00000000001001101111001000000000% ;%FSCALE⓪)DC.L 00000000001001001111001000000000% ;%FSGLDIV⓪)DC.L 00000000001001111111001000000000% ;%FSGLMUL⓪)DC.L 00000000001010001111001000000000% ;%FSUB⓪)DC.L 00000000000110001111001000000000% ;%FABS⓪)DC.L 00000000000111001111001000000000% ;%FACOS⓪)DC.L 00000000000011001111001000000000% ;%FASIN⓪)DC.L 00000000000010101111001000000000% ;%FATAN⓪)DC.L 00000000000011011111001000000000% ;%FATANH⓪)DC.L 00000000000111011111001000000000% ;%FCOS⓪)DC.L 00000000000110011111001000000000% ;%FCOSH⓪)DC.L 00000000000100001111001000000000% ;%FETOX⓪)DC.L 00000000000010001111001000000000% ;%FETOXM1⓪)DC.L 00000000000111101111001000000000% ;%FGETEXP⓪)DC.L 00000000000111111111001000000000% ;%FGETMAN⓪)DC.L 00000000000000011111001000000000% ;%FINT⓪)DC.L 00000000000000111111001000000000% ;%FINTRZ⓪)DC.L 00000000000101001111001000000000% ;%FLOGN⓪)DC.L 00000000000001101111001000000000% ;%FLOGNP1⓪)DC.L 00000000000101011111001000000000% ;%FLOG10⓪)DC.L 00000000000101101111001000000000% ;%FLOG2⓪)DC.L 00000000000110101111001000000000% ;%FNEG⓪)DC.L 00000000000011101111001000000000% ;%FSIN⓪)DC.L 00000000000000101111001000000000% ;%FSINH⓪)DC.L 00000000000001001111001000000000% ;%FSQRT⓪)DC.L 00000000000011111111001000000000% ;%FTAN⓪)DC.L 00000000000010011111001000000000% ;%FTANH⓪)DC.L 00000000000100101111001000000000% ;%FTENTOX⓪)DC.L 00000000000100011111001000000000% ;%FTWOTOX⓪)DC.L 00000000001100001111001000000000% ;%FSINCOS⓪ *)⓪ END⓪ END MneCodeTab;⓪ ⓪ ⓪ PROCEDURE MneArgTab;⓪ BEGIN⓪ ASSEMBLER DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0 ;%DBCC⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0 ;%DBF⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0 ;%EXT⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0 ;%RTS⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0⓪)DC.B 0 ;%DBRA (DBF)⓪)DC.B 0 ;%ILLEGAL⓪)DC.B 0 ;%BREAK⓪)DC.B 0 ;%MOVEC⓪)DC.B 0 ;%RTD⓪ ⓪ (*$ ? Asm20:⓪); Erweiterungen seit 3.3a / 1.8.86 f. 68020⓪)DC.B 0 ;%BFCHG⓪)DC.B 0 ;%BFCLR⓪)DC.B 0 ;%BFEXTS⓪)DC.B 0 ;%BFEXTU⓪)DC.B 0 ;%BFFFO⓪)DC.B 0 ;%BFINS⓪)DC.B 0 ;%BFSET⓪)DC.B 0 ;%BFTST⓪)DC.B 0 ;%BKPT⓪)DC.B 0 ;%CALLM⓪)DC.B 3 ;%CAS⓪)DC.B 3 ;%CAS2⓪)DC.B 0 ;%CHK2⓪)DC.B 0 ;%CMP2⓪)DC.B 0 ;%DIVSL⓪)DC.B 0 ;%DIVUL⓪)DC.B 0 ;%EXTB⓪)DC.B 0 ;%MOVES⓪)DC.B 3 ;%PACK⓪)DC.B 0 ;%RTM⓪)DC.B 0 ;%TRAPCC⓪)DC.B 0 ;%TRAPCS⓪)DC.B 0 ;%TRAPEQ⓪)DC.B 0 ;%TRAPF⓪)DC.B 0 ;%TRAPGE⓪)DC.B 0 ;%TRAPGT⓪)DC.B 0 ;%TRAPHI⓪)DC.B 0 ;%TRAPLE⓪)DC.B 0 ;%TRAPLS⓪)DC.B 0 ;%TRAPLT⓪)DC.B 0 ;%TRAPMI⓪)DC.B 0 ;%TRAPNE⓪)DC.B 0 ;%TRAPPL⓪)DC.B 0 ;%TRAPT⓪)DC.B 0 ;%TRAPVC⓪)DC.B 0 ;%TRAPVS⓪)DC.B 3 ;%UNPK⓪)⓪ ; Erweiterung für 68881⓪)DC.B 0 ;%FMOVE ; Umspeichern⓪)DC.B 0 ;%FMOVECR⓪)DC.B 0 ;%FMOVEM⓪)DC.B 0 ;%FRESTORE⓪)DC.B 0 ;%FSAVE⓪)DC.B 0 ;%FNOP⓪)DC.B 0 ;%FTST⓪)DC.B 0 ;%FBEQ ; Controls⓪)DC.B 0 ;%FBF⓪)DC.B 0 ;%FBGE⓪)DC.B 0 ;%FBGL⓪)DC.B 0 ;%FBGLE⓪)DC.B 0 ;%FBGT⓪)DC.B 0 ;%FBLE⓪)DC.B 0 ;%FBLT⓪)DC.B 0 ;%FBNE⓪)DC.B 0 ;%FBNGE⓪)DC.B 0 ;%FBNGL⓪)DC.B 0 ;%FBNGLE⓪)DC.B 0 ;%FBNGT⓪)DC.B 0 ;%FBNLE⓪)DC.B 0 ;%FBNLT⓪)DC.B 0 ;%FBSEQ⓪)DC.B 0 ;%FBSF⓪)DC.B 0 ;%FBSNE⓪)DC.B 0 ;%FBST⓪)DC.B 0 ;%FBOGE⓪)DC.B 0 ;%FBOGL⓪)DC.B 0 ;%FBOGT⓪)DC.B 0 ;%FBOLE⓪)DC.B 0 ;%FBOLT⓪)DC.B 0 ;%FBOR⓪)DC.B 0 ;%FBT⓪)DC.B 0 ;%FBUGE⓪)DC.B 0 ;%FBUEQ⓪)DC.B 0 ;%FBUN⓪)DC.B 0 ;%FBUGT⓪)DC.B 0 ;%FBULE⓪)DC.B 0 ;%FBULT⓪)DC.B 0 ;%FDBEQ⓪)DC.B 0 ;%FDBF⓪)DC.B 0 ;%FDBGE⓪)DC.B 0 ;%FDBGL⓪)DC.B 0 ;%FDBGLE⓪)DC.B 0 ;%FDBGT⓪)DC.B 0 ;%FDBLE⓪)DC.B 0 ;%FDBLT⓪)DC.B 0 ;%FDBNE⓪)DC.B 0 ;%FDBNGE⓪)DC.B 0 ;%FDBNGL⓪)DC.B 0 ;%FDBNGLE⓪)DC.B 0 ;%FDBNGT⓪)DC.B 0 ;%FDBNLE⓪)DC.B 0 ;%FDBNLT⓪)DC.B 0 ;%FDBSEQ⓪)DC.B 0 ;%FDBSF⓪)DC.B 0 ;%FDBSNE⓪)DC.B 0 ;%FDBST⓪)DC.B 0 ;%FDBOGE⓪)DC.B 0 ;%FDBOGL⓪)DC.B 0 ;%FDBOGT⓪)DC.B 0 ;%FDBOLE⓪)DC.B 0 ;%FDBOLT⓪)DC.B 0 ;%FDBOR⓪)DC.B 0 ;%FDBT⓪)DC.B 0 ;%FDBUGE⓪)DC.B 0 ;%FDBUEQ⓪)DC.B 0 ;%FDBUN⓪)DC.B 0 ;%FDBUGT⓪)DC.B 0 ;%FDBULE⓪)DC.B 0 ;%FDBULT⓪)DC.B 0 ;%FSEQ⓪)DC.B 0 ;%FSF⓪)DC.B 0 ;%FSGE⓪)DC.B 0 ;%FSGL⓪)DC.B 0 ;%FSGLE⓪)DC.B 0 ;%FSGT⓪)DC.B 0 ;%FSLE⓪)DC.B 0 ;%FSLT⓪)DC.B 0 ;%FSNE⓪)DC.B 0 ;%FSNGE⓪)DC.B 0 ;%FSNGL⓪)DC.B 0 ;%FSNGLE⓪)DC.B 0 ;%FSNGT⓪)DC.B 0 ;%FSNLE⓪)DC.B 0 ;%FSNLT⓪)DC.B 0 ;%FSSEQ⓪)DC.B 0 ;%FSSF⓪)DC.B 0 ;%FSSNE⓪)DC.B 0 ;%FSST⓪)DC.B 0 ;%FSOGE⓪)DC.B 0 ;%FSOGL⓪)DC.B 0 ;%FSOGT⓪)DC.B 0 ;%FSOLE⓪)DC.B 0 ;%FSOLT⓪)DC.B 0 ;%FSOR⓪)DC.B 0 ;%FST⓪)DC.B 0 ;%FSUGE⓪)DC.B 0 ;%FSUEQ⓪)DC.B 0 ;%FSUN⓪)DC.B 0 ;%FSUGT⓪)DC.B 0 ;%FSULE⓪)DC.B 0 ;%FSULT⓪)DC.B 0 ;%FTRAPEQ⓪)DC.B 0 ;%FTRAPF⓪)DC.B 0 ;%FTRAPGE⓪)DC.B 0 ;%FTRAPGL⓪)DC.B 0 ;%FTRAPGLE⓪)DC.B 0 ;%FTRAPGT⓪)DC.B 0 ;%FTRAPLE⓪)DC.B 0 ;%FTRAPLT⓪)DC.B 0 ;%FTRAPNE⓪)DC.B 0 ;%FTRAPNGE⓪)DC.B 0 ;%FTRAPNGL⓪)DC.B 0 ;%FTRAPNGLE⓪)DC.B 0 ;%FTRAPNGT⓪)DC.B 0 ;%FTRAPNLE⓪)DC.B 0 ;%FTRAPNLT⓪)DC.B 0 ;%FTRAPSEQ⓪)DC.B 0 ;%FTRAPSF⓪)DC.B 0 ;%FTRAPSNE⓪)DC.B 0 ;%FTRAPST⓪)DC.B 0 ;%FTRAPOGE⓪)DC.B 0 ;%FTRAPOGL⓪)DC.B 0 ;%FTRAPOGT⓪)DC.B 0 ;%FTRAPOLE⓪)DC.B 0 ;%FTRAPOLT⓪)DC.B 0 ;%FTRAPOR⓪)DC.B 0 ;%FTRAPT⓪)DC.B 0 ;%FTRAPUGE⓪)DC.B 0 ;%FTRAPUEQ⓪)DC.B 0 ;%FTRAPUN⓪)DC.B 0 ;%FTRAPUGT⓪)DC.B 0 ;%FTRAPULE⓪)DC.B 0 ;%FTRAPULT⓪)DC.B 0 ;%FADD ; Dyadic Operations⓪)DC.B 0 ;%FCMP⓪)DC.B 0 ;%FDIV⓪)DC.B 0 ;%FMOD⓪)DC.B 0 ;%FMUL⓪)DC.B 0 ;%FREM⓪)DC.B 0 ;%FSCALE⓪)DC.B 0 ;%FSGLDIV⓪)DC.B 0 ;%FSGLMUL⓪)DC.B 0 ;%FSUB⓪)DC.B 0 ;%FABS ; Monidic Operations⓪)DC.B 0 ;%FACOS⓪)DC.B 0 ;%FASIN⓪)DC.B 0 ;%FATAN⓪)DC.B 0 ;%FATANH⓪)DC.B 0 ;%FCOS⓪)DC.B 0 ;%FCOSH⓪)DC.B 0 ;%FETOX⓪)DC.B 0 ;%FETOXM1⓪)DC.B 0 ;%FGETEXP⓪)DC.B 0 ;%FGETMAN⓪)DC.B 0 ;%FINT⓪)DC.B 0 ;%FINTRZ⓪)DC.B 0 ;%FLOGN⓪)DC.B 0 ;%FLOGNP1⓪)DC.B 0 ;%FLOG10⓪)DC.B 0 ;%FLOG2⓪)DC.B 0 ;%FNEG⓪)DC.B 0 ;%FSIN⓪)DC.B 0 ;%FSINH⓪)DC.B 0 ;%FSQRT⓪)DC.B 0 ;%FTAN⓪)DC.B 0 ;%FTANH⓪)DC.B 0 ;%FTENTOX⓪)DC.B 0 ;%FTWOTOX⓪)DC.B 0 ;%FSINCOS ; Dual Monadic Operation⓪ *)⓪ END⓪ END MneArgTab;⓪ ⓪ ⓪ FORWARD MneJmpTab;⓪ ⓪ ⓪ PROCEDURE ASSM;⓪"BEGIN⓪$ASSEMBLER⓪)MOVE.L OPTIONS,D2⓪)MOVE.L D2,AsmOPTIONS⓪)LSR #1,D2 ;Soll BREAK erfolgen ?⓪)SCS BreakAgain⓪)BCC C0 ;nein⓪)LSL #1,D2⓪)MOVE.L D2,AsmOPTIONS⓪)MOVE.L D2,OPTIONS⓪)BREAK⓪ ⓪ C0 CLR GetLastSbl⓪)⓪);Default-Sprungweite fuer Bcc bestimmen:⓪)MOVE.L OPTIONS,D0⓪)BTST #04,D0 ;Test auf Debug-Option⓪)BEQ C1 ;Nein⓪)MOVE.B #2,DefltBcc ; '.W'⓪)BRA C2⓪ C1 MOVE.B #1,DefltBcc ; '.B'⓪ ⓪ C2 MOVE.L A4,pInstr⓪)MOVE.L pLastSym,pTxtMne⓪)MOVE.L pTxtLin,pTxtLin2 ;Zeilenbeginn retten⓪)MOVE.L TxtLine,TxtLine2 ;Zeilennr. retten⓪)ST DoingAsm⓪)CLR.B OprndCnt⓪)⓪)JSR AsmSameSbl⓪)TST.W D3⓪)BEQ JAL1 ;:UNBEKANNTES SYMBOL⓪)BMI JAL1 ;:AUF LABEL WIRD SCHON REFERIERT⓪)⓪)CMPI #AS39,D3 ; '!' ? (LABELDECLARATION ?)⓪)BNE TPSOP ;NEIN >⓪)⓪)JSR AsmGetSbl ;JA⓪ ⓪ !JAL1 JMP LABELEXP ;>ID ERWARTET⓪ ⓪ !TPSOP CMPI #AS_MneF,D3⓪)BCC L1⓪ ⓪ AER10 JMP AERR10 ;SYMBOL = SONDERZEICHEN > ERROR⓪)⓪ !L1 CMPI #AS_MneL,D3⓪)BLS L2 ;->Mnemonic⓪)CMPI #AS_m20F,D3⓪)BCS PsOp⓪)CMPI #AS_m20L,D3⓪)BHI AER10 ;->ERROR⓪)MOVE.L AsmOptions,D0⓪)BTST #24,D0⓪)BNE L1C1⓪)JMP AERR17 ; '68020 mnemonic not allowed'⓪ L1C1 SUBI #AS_M20F-AS_MneL-1,D3⓪)BRA L2 ;->Mnemonic⓪)⓪ psop JMP PseudoOp ;PSEUDO-OP GEFUNDEN⓪ ⓪ (*$ ? Gepard:⓪ AER15 JMP AERR15 ;Fehlermeldung bei RTE⓪ *)⓪ ⓪ !L2 JSR ErrOnOddAdr⓪)⓪)SUBI #AS_MneF,D3 ;D3:=Mnemonic-Nr.⓪)LEA MneArgTab,A0 ;Tabelle für Anzahl d. Argumente⓪)MOVE.B 0(A0,D3.W),D0⓪)MOVE.B D0,Args⓪)LSL.L #2,D3 ;D3:=Mnemonic-Nr. mal 4⓪)LEA MneCodeTab,A0 ;Anf. Tabelle der Opcodes⓪)⓪)(*$ ? Gepard:⓪+MOVE.L 0(A0,D3.W),D0⓪+CMPI.W #$4E73,D0 ;Ist Mnemonic = RTE ?⓪+BEQ AER15 ;Ja:ERROR⓪+MOVE.L D0,MneSecCode⓪)*)⓪)⓪)(*$ ? Atari:⓪+MOVE.L 0(A0,D3.W),MneSecCode⓪)*)⓪)⓪)LEA MneJmpTab,A0 ;Anfang der Sprungtabelle⓪)MOVE.L 0(A0,D3.W),D0 ;Sprungvektor des Befehls⓪)CMPI.L #NoOperandsWZE,D0 ;Test,ob der Befehl Operanden erwartet⓪)BEQ NOpWZE⓪)CMPI.L #NoOperands,D0 ;Test,ob der Befehl Operanden erwartet⓪)BNE WithOprd⓪)⓪)JSR AsmGetSbl⓪)MOVE.W MneCode,(A4)+⓪)BRA.L JRET1 ;kein Operand erwartet,-> zum naechsten Befehl⓪ ⓪ NOpWZE JSR AsmGetSbl⓪)MOVE.W MneCode,(A4)+⓪)CLR.W (A4)+⓪)BRA.L JRET1 ;kein Operand erwartet,-> zum naechsten Befehl⓪ ⓪ WithOprd MOVE.L D0,MneVec ;rette Sprungvektor fuer Operanden-Auswertung⓪)CLR.L ModeDest⓪)⓪)MOVEQ #0,D0⓪)JSR GetSize⓪)⓪)CLR ModeSource⓪)CLR ModeDest⓪)CLR ModeThird⓪)⓪)JSR AsmGetSbl⓪)MOVE.L pLastSym,pTxtOp1⓪)ADDQ.B #1,OprndCnt⓪)JSR GetEA⓪)JSR LastToSource⓪)⓪)JSR AsmSameSbl⓪)CMPI #AS38,D3 ; KOMMA ?⓪)BNE ASSML4⓪)⓪)JSR AsmGetSbl⓪)MOVE.L pLastSym,pTxtOp2⓪)ADDQ.B #1,OprndCnt⓪)JSR GetEA⓪)JSR LastToDest⓪)TST.B ModeDest⓪)BEQ.L JAER1 ; ERROR: fehlender Operand nach Komma⓪)⓪)CMPI.B #3,Args⓪)BNE AssmL4⓪)⓪)JSR AsmSameSbl⓪)CMPI #AS38,D3 ; KOMMA ?⓪)BNE.L JAER1⓪)⓪)JSR AsmGetSbl⓪)MOVE.L pLastSym,pTxtOp3⓪)ADDQ.B #1,OprndCnt⓪)JSR GetEA⓪)JSR LastToThird⓪)TST.B ModeThird⓪)BEQ.L JAER1 ; ERROR: fehlender Operand nach Komma⓪)⓪ ASSML4 CLR.B OprndCnt⓪)JSR SourceToLast⓪)MOVE.L MneSecCode,D1⓪)ADDQ.L #2,A4⓪)MOVEA.L MneVec,A0⓪)MOVEQ #1,D5⓪)TST.B BreakAgain⓪)BEQ nobrk2⓪)BREAK⓪ noBrk2 JSR (A0)⓪)MOVE.L pInstr,A0⓪)MOVE D1,(A0)⓪ JRET1 JMP NextLine⓪ JAER1 JMP AERR1⓪ END⓪ END ASSM;⓪ ⓪ ⓪ (****************************************************************************⓪0BEGINN DER INDIVIDUELLEN MNEMONIC - AUSWERTUNG⓪ ****************************************************************************)⓪ ⓪ ⓪ PROCEDURE MN31A;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeSource,D0⓪)CMPI.B #1,D0 ; S: 'Dn' ?⓪)BEQ MN0A⓪)CMPI.B #5,D0 ; S: '-(An)' ?⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)MOVE.B ModeDest,D0⓪)CMPI.B #5,D0 ; D: '-(An)' ?⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)JSR RegTo9_11⓪)BSET #3,D1⓪)RTS⓪ !MN0A MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)JMP RegTo9_11⓪ END⓪ END MN31A;⓪ ⓪ (*⓪ * %ADDX, %SUBX⓪ *)⓪ PROCEDURE MN31;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo6_7⓪)JMP MN31A⓪ END⓪ END MN31;⓪ ⓪ (* %ABCD, %SBCD *)⓪ PROCEDURE MN0;⓪ BEGIN⓪ ASSEMBLER MOVEQ #1,D0⓪)JSR VerifySize⓪)JMP MN31A⓪ END⓪ END MN0;⓪ ⓪ (*$ ? Asm20:⓪ ⓪ (* %PACK, %UNPK *)⓪ PROCEDURE MnePACK_UNPK;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)JSR MN31A⓪)CMPI.B #12,ModeThird⓪)BNE AER1⓪)MOVE.W #1111111111010%,D3⓪)JSR TestTypeThird⓪)MOVE.L DataThird,D0⓪)JMP ApndD0_W⓪ AER1 JMP AERR1⓪ END⓪ END MnePACK_UNPK;⓪ ⓪ *)⓪ ⓪ (* %ADD %SUB %AND %OR *)⓪ PROCEDURE MN1;⓪ BEGIN⓪ ASSEMBLER⓪)JSR LoadSize⓪)JSR SizeTo6_7⓪)CMPI.B #1,ModeDest ;ist Dest. = DataReg ?⓪)BNE MN1B ;Nein -> weiter testen⓪)⓪)MOVE.B RegDest,D0⓪)JSR RegTo9_11⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ ⓪ AER1 JMP AERR1⓪ ⓪ MN1B CMPI.B #1,ModeSource ;Ist Source = Data.Reg. ?⓪)BNE AER1 ;Nein ->ERROR⓪)CMPI.B #2,ModeDest ;ist Dest. = Adr-Reg.?⓪)BEQ AER1 ;ja -> ERROR⓪)CMPI.B #10,ModeDest⓪)BCC AER1⓪)⓪)MOVE.B RegSource,D0⓪)JSR RegTo9_11⓪)BSET #8,D1⓪)JSR DestTo0_5⓪)JMP ApndDest⓪ END⓪ END MN1;⓪ ⓪ (* %ADDA, %SUBA, %CMPA *)⓪ PROCEDURE MN2;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeDest,D0⓪)CMPI.B #2,D0 ; D: 'An' ?⓪)BEQ OK1⓪)JMP AERR1⓪ !OK1 JSR LoadSize⓪)CMPI.B #2,D0 ; Size # BYTE ?⓪)BEQ MN2A⓪)CMPI.B #4,D0⓪)BEQ OK⓪)JMP AERR2⓪ !OK BSET #8,D1⓪ MN2A BSET #7,D1⓪)BSET #6,D1⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)MOVE.B RegDest,D0⓪)JMP RegTo9_11⓪ END⓪ END MN2;⓪ ⓪ ⓪ PROCEDURE @MN3;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo6_7⓪)CMPI.B #12,ModeSource ; S: '#' ?⓪)BEQ OK1⓪)JMP AERR1⓪ !OK1 JSR ApndSource⓪)JSR DestTo0_5⓪)JMP ApndDest⓪ END⓪ END @MN3;⓪ ⓪ ⓪ (*⓪ * %ADDI, %SUBI⓪ *)⓪ PROCEDURE MN3;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L #0001111111010%,D0⓪)JSR CheckModeDest⓪)JMP @MN3⓪ END⓪ END MN3;⓪ ⓪ (*⓪ * %CMPI⓪ *)⓪ PROCEDURE MneCMPI;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L #0001111111010%,D0⓪)MOVE.L AsmOptions,D2⓪)BTST #24,D2⓪)BEQ ok0⓪)ORI.L #0110000000000%,D0 ; 68020 kann auch PC-rel.⓪ ok0 JSR CheckModeDest⓪)JMP @MN3⓪ END⓪ END MneCMPI;⓪ ⓪ (*⓪ * %ANDI, %EORI, %ORI⓪ *)⓪ PROCEDURE MN4;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeDest,D0⓪)CMPI.B #13,D0 ;'SR' ?⓪)BEQ C2⓪)CMPI.B #15,D0 ;'CCR' ?⓪)BEQ C1⓪)JMP MN3 ;weiter wie ADDI,CMPI,SUBI⓪ C1 MOVEQ #1,D0 ; CCR : BYTE-Operation⓪)BRA C3⓪ C2 MOVEQ #2,D0 ; SR : WORD-Operation⓪ C3 JSR VerifySize⓪)MOVE.B D0,SizeOfData⓪)JMP @MN3⓪ END⓪ END MN4;⓪ ⓪ (*⓪ * %ADDQ, %SUBQ⓪ *)⓪ PROCEDURE MN5;⓪ BEGIN⓪ ASSEMBLER CMPI.B #12,ModeSource⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK JSR LoadSize⓪)JSR SizeTo6_7⓪)JSR d3To9_11 ; # - Konstante eintragen in D1⓪@; Hier erfolgt auch Pruefung der Datengroesse⓪)MOVE.B ModeDest,D0⓪)CMPI.B #10,D0⓪)BCC AER1⓪)JSR DestTo0_5⓪)JMP ApndDest⓪ END⓪ END MN5;⓪ ⓪ (*⓪ * %ASL, %ASR, %LSL, %LSR, %ROL, %ROR, %ROXL, %ROXR⓪ *)⓪ PROCEDURE MN6;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo6_7⓪)MOVE.B ModeSource,D0⓪)CMPI.B #1,D0 ; S: 'Dn' ?⓪)BEQ MN6A⓪)CMPI.B #12,D0 ; S: '#' ?⓪)BNE MN6B⓪)⓪); '#d3,Dn'⓪)ANDI.W #$F1FF,D1⓪)MOVE.W #1111111101010%,D3⓪)JSR TestTypeSource⓪)JSR d3To9_11 ; # - Konstante eintragen in D1⓪@; Hier erfolgt auch Pruefung der Datengroesse⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.B RegDest,D0⓪)JMP RegTo0_2⓪ ⓪ MN6A ; 'Dn,Dn'⓪)ANDI.W #$F1FF,D1⓪)BSET #5,D1⓪)MOVE.B RegSource,D0⓪)JSR RegTo9_11⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0 ; S: 'Dn' ?⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)JMP RegTo0_2⓪ ⓪ AER2 JMP AERR2⓪ ⓪ MN6B ; '<ea>'⓪)CMPI.B #10,D0⓪)BCC AER1⓪)CMPI.B #2,D0 ; S: 'An' ?⓪)BEQ AER1⓪)JSR LoadSize⓪)CMPI.B #2,D0 ; nur WORD ist erlaubt⓪)BNE AER2⓪)ANDI.W #$FFC0,D1⓪)BSET #6,D1⓪)BSET #7,D1⓪)MOVE.W #1010010011001%,D3⓪)JSR TestTypeSource⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)JMP ErrIfOp2⓪ END⓪ END MN6;⓪ ⓪ ⓪ (*⓪ * Hauptroutine fuer Bcc und DBcc⓪ *)⓪ PROCEDURE @MN7A;⓪ BEGIN⓪ ASSEMBLER MOVE.W DataType,D3⓪)BMI.L C1 ;undefined Label / lokal Proc.⓪)⓪)MOVE.L Data,D0⓪)BTST #8,D3⓪)BNE C2 ;lok. Label⓪)BTST #10,D3 ;lok. Proc.⓪)BEQ AER5 ;ERROR:label expected⓪)⓪ C2 ADD.L CodeStart,D0⓪)MOVE.L pInstr,D2⓪)ADD.L D5,D2 ; Achtung: normalerweise wird hier 2 addiert,⓪)ADD.L D5,D2 ; bei FDBcc wird 4 addiert !!⓪)⓪ C8 SUB.L D2,D0⓪)⓪)CMPI.L #$8000,D0⓪)BCS C3⓪)CMPI.L #$FFFF8000,D0⓪)BCC C3⓪)⓪ AER3 JMP AERR3⓪ AER5 JMP AERR5⓪ AER2 JMP AERR2⓪ ⓪ C3 CMPI.L #$80,D0⓪)BCS C4⓪)CMPI.L #$FFFFFF80,D0⓪)BCC C4⓪)⓪)TST.B SizeOfData⓪)BEQ C5⓪)CMPI.B #8,SizeOfData ; '.S'⓪)BHI AER2⓪)BEQ AER3⓪)CMPI.B #1,SizeOfData ; '.B'⓪)BEQ AER3⓪ ⓪ C5 JMP ApndD0_W⓪ ⓪ C4 TST.B SizeOfData⓪)BEQ C9⓪)CMPI.B #4,SizeOfData ; '.L'⓪)BEQ C5⓪)CMPI.B #2,SizeOfData ; '.W'⓪)BEQ C5⓪)CMPI.B #8,SizeOfData ; '.S'⓪)BEQ C9⓪)CMPI.B #1,SizeOfData ; '.B'⓪)BNE AER2⓪ C9 MOVE.B D0,D1⓪)RTS⓪ ⓪ ; Forward Ref. to Label / lokal Proc.⓪ C1 BTST #10,D3 ;lok. Proc.?⓪)BNE C7⓪)BTST #08,D3 ;undefined Label ?⓪)BEQ AER5⓪)⓪ ;Forw.Ref to Label⓪)TST.B SizeOfData⓪)BNE C10⓪)MOVE.B DefltBcc,SizeOfData⓪ C10 CMPI.B #1,SizeOfData ; '.B'⓪)BEQ C11⓪)CMPI.B #8,SizeOfData ; '.S'⓪)BEQ C11⓪)BHI AER2⓪); Long-Bcc⓪)MOVEA.L IDPtr,A0⓪)SUBQ.L #4,A0⓪)BRA C12⓪)⓪); Short-Bcc⓪ C11 MOVEA.L IDPtr,A0⓪)SUBQ.L #8,A0⓪)⓪)MOVEQ #1,D2⓪)MOVE.L (A0),D0 ;Word-Verkettungspointer merken⓪)BNE C14⓪)⓪)ADD.L pInstr,D2⓪)MOVE.L D2,(A0) ;momentane Adresse als ^ eintragen⓪)BSET #7,D0⓪)MOVE.B D0,D1⓪)RTS⓪)⓪ ;Forw.Ref to lokal Proc.⓪ C7 CMPI.B #8,SizeOfData ; '.S'⓪)BHI AER2⓪)BEQ AER3⓪)CMPI.B #1,SizeOfData ; '.B'⓪)BEQ AER3⓪)⓪)MOVE.B #2,SizeOfData ; '.W' als Default⓪)⓪)MOVEA.L IDPtr,A0⓪)⓪ C12 MOVE.L D5,D2 ; Achtung: normalerweise wird hier 2 addiert,⓪)ADD.L D5,D2 ; bei FDBcc wird 4 addiert !!⓪ ⓪ C13 MOVE.L (A0),D0 ;Word-Verkettungspointer merken⓪ C14 ADD.L pInstr,D2⓪)MOVE.L D2,(A0) ;momentane Adresse als ^ eintragen⓪)⓪)TST.L D0⓪)BEQ C3 ;1.Ref. -> Null als Verkettungspointer⓪)BRA C8 ;Sonst: Wort-Verkettungs-^ bestimmen⓪ END⓪ END @MN7A;⓪ ⓪ ⓪ (*⓪ * %Bcc⓪ *)⓪ PROCEDURE MN7;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfOp2⓪)JSR SourceToLast⓪)JMP @MN7A⓪ END⓪ END MN7;⓪ ⓪ ⓪ (*⓪ * %DBcc⓪ *)⓪ PROCEDURE MN14;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeSource,D0⓪)CMPI.B #1,D0 ;Source = 'Dn' ?⓪)BEQ OK⓪)JMP AERR1 ;nein:ERROR⓪ !OK MOVEQ #2,D0⓪)JSR VerifySize⓪)MOVE.B D0,SizeOfData ; '.W' als Default⓪)MOVE.B RegSource,D0⓪)JSR RegTo0_2 ;setze Reg. in Code-Wort⓪)JSR DestToLast⓪)JMP @MN7A⓪ END⓪ END MN14;⓪ ⓪ ⓪ (* #d8,<ea> ausser : #8,Dn *)⓪ PROCEDURE MN9A;⓪ BEGIN⓪ ASSEMBLER MOVE.W #1111111101010%,D3⓪)JSR TestTypeSource⓪)MOVEQ #1,D0⓪)JSR VerifySize⓪)MOVE.L DataSource,D0⓪)CMPI.L #8,D0⓪)BCS OK⓪)JMP AERR1⓪ !OK JSR ApndD0_W⓪)JSR DestTo0_5⓪)JMP ApndDest⓪ END⓪ END MN9A;⓪ ⓪ (* #d8,Dn *)⓪ PROCEDURE MN8B;⓪ BEGIN⓪ ASSEMBLER MOVE.W #1111111101010%,D3⓪)JSR TestTypeSource⓪)MOVEQ #4,D0⓪)JSR VerifySize⓪)MOVE.L DataSource,D0⓪)CMPI.L #32,D0⓪)BCS OK⓪)JMP AERR1⓪ !OK JSR ApndD0_W⓪)JSR DestTo0_5⓪)JMP ApndDest⓪ END⓪ END MN8B;⓪ ⓪ ⓪ PROCEDURE MN9C;⓪ BEGIN⓪ ASSEMBLER CMPI.B #1,D0 ;Dest = 'Dn' ?⓪)BNE L1⓪)JMP MN8B⓪ !L1 JMP MN9A⓪ END⓪ END MN9C;⓪ ⓪ ⓪ (* Dn,<ea> *)⓪ PROCEDURE MN9B;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeDest,D0⓪)CMPI.B #13,D0⓪)BCS OK⓪ !AER1 JMP AERR1⓪ !AER2 JMP AERR2⓪ !OK CMPI.B #2,D0 ; D: 'An' ?⓪)BEQ AER1⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BNE C1⓪)⓪)MOVEQ #4,D0 ; Size muss .L sein⓪)BRA C3⓪)⓪ C1 MOVEQ #1,D0 ; Size muss .B sein⓪ ⓪ C3 JSR VerifySize⓪)JSR DestTo0_5⓪)JSR ApndDest⓪)MOVE.B RegSource,D0⓪)JMP RegTo9_11⓪ END⓪ END MN9B;⓪ ⓪ ⓪ PROCEDURE MN8A;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeDest,D0⓪)CMPI.B #10,D0⓪)BCS OK⓪)JMP AERR1⓪ !OK JMP MN9B⓪ END⓪ END MN8A;⓪ ⓪ ⓪ (*⓪ * %BCHG, %BCLR, %BSET⓪ *)⓪ PROCEDURE MN8;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeSource,D0⓪)CMPI.B #1,D0⓪)BNE L1⓪)JMP MN8A ; Dn,<ea>⓪ !L1 CMPI.B #12,D0⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK BSET #11,D1 ; #d8,<ea>⓪)BCLR #8,D1⓪)MOVE.B ModeDest,D0⓪)CMPI.B #10,D0⓪)BCC AER1⓪)CMPI.B #2,D0⓪)BEQ AER1⓪)JMP MN9C⓪ END⓪ END MN8;⓪*⓪ (*⓪ * %BTST⓪ *)⓪ PROCEDURE MN9;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeSource,D0⓪)CMPI.B #1,D0 ; S:'Dn' ?⓪)BNE L1⓪)JMP MN9B⓪ !L1 CMPI.B #12,D0 ; S:'#' ?⓪)BEQ OK1⓪)JMP AERR1⓪ !OK1 BSET #11,D1⓪)BCLR #8,D1⓪)MOVE.B ModeDest,D0⓪)CMPI.B #12,D0⓪)BCS OK⓪)JMP AERR1⓪ !OK JMP MN9C⓪ END⓪ END MN9;⓪ ⓪ ⓪ (*⓪ * %MULS, %MULU, %DIVS, %DIVU⓪ *)⓪ PROCEDURE MN10;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #2,D0⓪)BEQ okW⓪)CMPI.B #4,D0⓪)BEQ okL⓪)⓪ !AER2 JMP AERR2⓪ !AER1 JMP AERR1⓪ ⓪ okW MOVE.L #1111011111010%,D0⓪)JSR CheckModeSource⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)JMP RegTo9_11⓪ ⓪ okL ; 68020 - Behandlung⓪)MOVE.L AsmOptions,D2⓪)BTST #24,D2⓪)BEQ AER2⓪)⓪)CLR D2 ; Erw-Wort bei 68020 long form⓪)BTST #8,D1⓪)BEQ c0⓪)BSET #11,D2⓪ c0 MOVE #0100110000000000%,D3 ; Long form of instruction⓪)BTST #14,D1⓪)BNE c2⓪)BSET #6,D3⓪ c2 MOVE D3,D1⓪)⓪)MOVE.B ModeDest,D0⓪)ANDI #$7F,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BNE AER1⓪)⓪); Dp - reg. bestimmen⓪)MOVE.B RegDest,D0⓪)ROR.W #4,D0 ; oberes Byte des Wortes schon Null⓪@; ??? soll die vorige Zeile dasein ?⓪)OR D0,D2⓪)⓪)TST.B ModeDest⓪)BPL NoDouble⓪)⓪); Doppelregs nur bei Adr-Arten mit Dn erlaubt⓪)CMPI.B #1,Mode2Dest ; Dn ?⓪)BNE AER1⓪)OR.B Reg2Dest,D2⓪)BSET #10,D2 ; Sz - field: 64 bit operation⓪)⓪ NoDouble MOVE.L #1111011111010%,D0⓪)JSR CheckModeSource⓪)MOVE D2,D0⓪)JSR ApndD0_W⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END MN10;⓪ ⓪ ⓪ (*⓪ * %DIVSL, %DIVUL⓪ *)⓪ ⓪ (*$ ? Asm20:⓪ ⓪ PROCEDURE MneDIVSL_UL;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #4,D0⓪)BEQ okL⓪)⓪ !AER2 JMP AERR2⓪ !AER1 JMP AERR1⓪ ⓪ okL ; 68020 - Behandlung⓪)MOVE.L Options,D2⓪)BTST #24,D2 ;$X⓪)BEQ AER2⓪)⓪)CLR D2 ; Erw-Wort bei 68020 long form⓪)BTST #8,D1⓪)BEQ c0⓪)BSET #11,D2⓪ c0 MOVE #0100110001000000%,D1 ; Long form of instruction⓪)⓪)MOVE.B ModeDest,D0⓪)ANDI #$7F,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BNE AER1⓪)⓪); Dp - reg. bestimmen⓪)MOVE.B RegDest,D0⓪)OR D0,D2⓪)⓪)TST.B ModeDest⓪)BPL AER1⓪)⓪); Doppelregs nur bei Adr-Arten mit Dn erlaubt⓪)CMPI.B #1,Mode2Dest ; Dn ?⓪)BNE AER1⓪)MOVE.B Reg2Dest,D0⓪)CMP.B RegDest,D0⓪)BEQ AER1⓪)⓪)ROR.W #4,D0 ; oberes Byte des Wortes schon Null⓪)OR D0,D2⓪)MOVE.L #1111011111010%,D0⓪)JSR CheckModeSource⓪)MOVE D2,D0⓪)JSR ApndD0_W⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END MneDIVSL_UL;⓪ *)⓪ ⓪ (*⓪ * %CHK⓪ *)⓪ PROCEDURE MneCHK;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #2,D0⓪)BEQ OK0⓪)MOVE.L AsmOptions,D2⓪)BTST #24,D2⓪)BEQ AER2⓪)BCLR #7,D1 ; Size auf Long⓪)CMPI.B #4,D0⓪)BEQ OK0⓪ AER2 JMP AERR2⓪ OK0 MOVE.B ModeSource,D0⓪)CMPI.B #2,D0 ; S: 'An' ?⓪)BNE OK⓪ !AER1 JMP AERR1⓪ !OK CMPI.B #13,D0⓪)BCC AER1⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)JMP RegTo9_11⓪ END⓪ END MneCHK;⓪)⓪ (*$ ? Asm20:⓪ ⓪ (*⓪!* %CHK2, %CMP2⓪!*)⓪ PROCEDURE MneCHK2_CMP2;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo9_10⓪)MOVE.L #0000000000110%,D0⓪)JSR CheckModeDest⓪)CLR.W D0⓪)MOVE.B RegDest,D0⓪)ROR.W #4,D0⓪)BSET #11,D0⓪)CMPI.B #1,ModeDest⓪)BEQ ok⓪)BSET #15,D0⓪ ok JSR ApndD0_W⓪)MOVE.L #0111011001000%,D0⓪)JSR CheckModeSource⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END MneCHK2_CMP2;⓪ ⓪ *)⓪ ⓪ (*⓪ * %CLR, %NEG, %NEGX, %NOT⓪ *)⓪ PROCEDURE MN11;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo6_7⓪)MOVE.B ModeSource,D0⓪)CMPI.B #10,D0⓪)BCS OK⓪ !AER1 JMP AERR1⓪ !OK CMPI.B #2,D0⓪)BEQ AER1⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)JMP ErrIfOp2⓪ END⓪ END MN11;⓪ ⓪ ⓪ (*⓪ * %TST⓪ *)⓪ PROCEDURE MneTST;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo6_7⓪)MOVE.L #0001111111010%,D0⓪)MOVE.L AsmOptions,D2⓪)BTST #24,D2⓪)BEQ ok0⓪)ORI.L #0110000000000%,D0 ; 68020 kann auch PC-rel.⓪ ok0 JSR CheckModeSource⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)JMP ErrIfOp2⓪ END⓪ END MneTST;⓪ ⓪ (*$ ? Asm20:⓪ ⓪ (*⓪ * %RTM⓪ *)⓪ PROCEDURE MneRTM;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)MOVE.L #0000000000110%,D0⓪)JSR CheckModeSource⓪)JSR SourceTo0_5⓪)JMP ErrIfOp2⓪ END⓪ END MneRTM;⓪ ⓪ *)⓪ ⓪ (*⓪ * %CMP⓪ *)⓪ PROCEDURE MN12;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeDest,D0⓪)CMPI.B #1,D0 ; D: 'Dn' ?⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.B RegDest,D0⓪)JSR RegTo9_11⓪)JSR LoadSize⓪)JSR SizeTo6_7⓪)MOVE.B ModeSource,D0⓪)CMPI.B #13,D0⓪)BCC AER1⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END MN12;⓪ ⓪ (*⓪ * %CMPM⓪ *)⓪ PROCEDURE MN13;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR SizeTo6_7⓪)MOVE.B ModeSource,D0⓪)CMPI.B #4,D0 ; S: '(An)+' ?⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)MOVE.B ModeDest,D0⓪)CMPI.B #4,D0 ; D: '(An)+' ?⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)JMP RegTo9_11⓪ END⓪ END MN13;⓪ ⓪ ⓪ (*⓪ * %EOR⓪ *)⓪ PROCEDURE MN15;⓪ BEGIN⓪ ASSEMBLER⓪)BSET #8,D1⓪)JSR LoadSize⓪)JSR SizeTo6_7⓪)MOVE.B ModeSource,D0⓪)CMPI.B #1,D0⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.B RegSource,D0⓪)JSR RegTo9_11⓪)MOVE.B ModeDest,D0⓪)CMPI.B #10,D0⓪)BCC AER1⓪)CMPI.B #2,D0⓪)BEQ AER1⓪)JSR DestTo0_5⓪)JMP ApndDest⓪ END⓪ END MN15;⓪ ⓪ ⓪ (*⓪ * %EXG⓪ *)⓪ PROCEDURE MN16;⓪ BEGIN⓪ ASSEMBLER MOVEQ #4,D0⓪)JSR VerifySize⓪)MOVE.B RegSource,D0⓪)MOVE.B ModeSource,D4⓪)CMPI.B #1,D4⓪)BEQ MN16A⓪)CMPI.B #2,D4⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !AER2 JMP AERR2⓪ ⓪ !OK JSR RegTo0_2⓪)MOVE.B RegDest,D0⓪)JSR RegTo9_11⓪)MOVE.B ModeDest,D4⓪)CMPI.B #1,D4⓪)BEQ MN16B⓪)CMPI.B #2,D4⓪)BNE AER1⓪)BSET #6,D1⓪)BSET #3,D1⓪)RTS⓪ ⓪ MN16B BSET #7,D1⓪)BSET #3,D1⓪)RTS⓪ ⓪ MN16A JSR RegTo9_11⓪)MOVE.B RegDest,D0⓪)JSR RegTo0_2⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0⓪)BEQ MN16C⓪)CMPI.B #2,D0⓪)BEQ MN16B⓪)BRA AER1⓪ ⓪ MN16C BSET #6,D1⓪ END⓪ END MN16;⓪ ⓪ ⓪ (*⓪ * %EXT, %EXTB⓪ *)⓪ PROCEDURE MneEXT;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #1,D0⓪)BEQ AER1⓪)CMPI.B #2,D0⓪)BEQ ADR9B⓪)BSET #6,D1⓪ ADR9B MOVE.B ModeSource,D0⓪)CMPI.B #1,D0⓪)BNE AER1⓪)MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)JMP ErrIfOp2⓪ AER1 JMP AERR1⓪ END⓪ END MneEXT;⓪ ⓪ ⓪ (*⓪ * %CAS⓪ *)⓪ PROCEDURE MneCAS;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)JSR Size2To9_10⓪)JSR ThirdTo0_5⓪)CMPI.B #1,ModeSource⓪)BNE AER1⓪)CMPI.B #1,ModeDest⓪)BNE AER1⓪)CLR D0⓪)MOVE.B RegSource,D0⓪)CLR D2⓪)MOVE.B RegDest,D2⓪)LSL #6,D2⓪)OR D2,D0⓪)JSR ApndD0_W⓪)MOVE.L #0001011111000%,D0⓪)JSR CheckModeThird⓪)JMP ApndThird⓪)⓪ AER1 JMP AERR1⓪ END⓪ END MneCAS;⓪ ⓪ (*$ ? Asm20:⓪ ⓪ (*⓪ * %CAS2⓪ *)⓪ PROCEDURE MneCAS2;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #1,D0⓪)BEQ AER2⓪)JSR Size2To9_10⓪)CMPI.B #$81,ModeSource⓪)BEQ ok0⓪ AER1 JMP AERR1⓪ AER2 JMP AERR2⓪ ok0 CMPI.B #1,Mode2Source⓪)BNE AER1⓪)CMPI.B #$81,ModeDest⓪)BNE AER1⓪)CMPI.B #1,Mode2Dest⓪)BNE AER1⓪)MOVE.B ModeThird,D0⓪)CMPI.B #$83,D0 ; '(An) ?⓪)BEQ ok1⓪)CMPI.B #17+$80,D0 ; '(Dn) ?⓪)BNE AER1⓪ ok1 MOVE.B Mode2Third,D0⓪)CMPI.B #3,D0 ; '(An) ?⓪)BEQ ok2⓪)CMPI.B #17,D0 ; '(Dn) ?⓪)BNE AER1⓪)⓪ ok2 CLR D0⓪)MOVE.B RegSource,D0⓪)CLR D2⓪)MOVE.B RegDest,D2⓪)LSL #6,D2⓪)OR D2,D0⓪)CLR D2⓪)MOVE.B RegThird,D2⓪)ROR #4,D2⓪)CMPI.B #$80+3,ModeThird ; '(An)' ?⓪)BNE ok3⓪)BSET #15,D2⓪ ok3 OR D2,D0⓪)JSR ApndD0_W⓪)⓪)CLR D0⓪)MOVE.B Reg2Source,D0⓪)CLR D2⓪)MOVE.B Reg2Dest,D2⓪)LSL #6,D2⓪)OR D2,D0⓪)CLR D2⓪)MOVE.B Reg2Third,D2⓪)ROR #4,D2⓪)CMPI.B #3,Mode2Third ; '(An)' ?⓪)BNE ok4⓪)BSET #15,D2⓪ ok4 OR D2,D0⓪)JMP ApndD0_W⓪ END⓪ END MneCAS2;⓪ ⓪ *)⓪ ⓪ PROCEDURE @MN19A;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0⓪)BCS OK⓪ !AER1 JMP AERR1⓪ !OK CMPI.B #5,D0⓪)BEQ AER1⓪)CMPI.B #4,D0⓪)BEQ AER1⓪)CMPI.B #2,D0⓪)BLS AER1⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END @MN19A;⓪ ⓪ (*⓪ * %JSR,%JMP⓪ *)⓪ PROCEDURE MN18;⓪ BEGIN⓪ ASSEMBLER⓪(JSR ErrIfOp2⓪(MOVE.W #1000000111001%,D3⓪(JSR TestTypeSource⓪(JMP @MN19A⓪ END⓪ END MN18;⓪ ⓪ ⓪ (*⓪ * %PEA⓪ *)⓪ PROCEDURE MN18P;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfOp2⓪ (*$ ? Gepard:⓪)CMPI.B #3,ModeSource⓪)BCS ok1⓪)CMPI.B #7,ModeSource⓪)BHI ok1⓪); Operand ist (An), x(An), -(An), (An)+ oder x(An,Xn.S)⓪)CMPI.B #3,RegSource ; A3 ?⓪)BNE ok1⓪)MOVE.W #asmIllAM,D2 ;ja-> Warning ausgeben⓪)MOVEQ #1,D3 ;source-Operand⓪)JSR AsmWarning⓪ *)⓪ ok1 JMP @MN19A⓪ END⓪ END MN18P;⓪ ⓪ ⓪ (*⓪ * %LEA⓪ *)⓪ PROCEDURE MN19;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪ (*$ ? Gepard:⓪)MOVE.W #asmIllAM,D2 ;Warning ausgeben⓪)CMPI.B #3,ModeSource⓪)BCS ok1⓪)CMPI.B #7,ModeSource⓪)BHI ok1⓪); Operand ist (An), x(An), -(An), (An)+ oder x(An,Xn.S)⓪)CMPI.B #3,RegSource ; source = (A3) ?⓪)BNE ok1⓪)CMPI.B #3,RegDest ; dest = A3 ?⓪)BEQ ok2 ; LEA x(A3...),A3 ist erlaubt⓪)MOVEQ #1,D3 ;source-Operand⓪)JSR AsmWarning⓪)BRA ok2⓪ ok1 CMPI.B #3,RegDest ; dest = A3 ?⓪)BNE ok2 ; LEA xx,A3 ist nicht erlaubt⓪)MOVEQ #2,D3 ; dest-Operand⓪)JSR AsmWarning⓪ *)⓪ ok2 MOVE.B ModeDest,D0⓪)CMPI.B #2,D0⓪)BEQ OK⓪)JMP AERR1⓪ !OK MOVE.B RegDest,D0⓪)JSR RegTo9_11⓪)JMP @MN19A⓪ END⓪ END MN19;⓪ ⓪ ⓪ (*⓪ * %LINK⓪ *)⓪ PROCEDURE MN20;⓪ BEGIN⓪ ASSEMBLER MOVE.W #1111111111010%,D3⓪)JSR TestTypeSource⓪)MOVE.B ModeSource,D0⓪)CMPI.B #2,D0⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.B ModeDest,D0⓪)CMPI.B #12,D0⓪)BNE AER1⓪)JSR LoadSize⓪)CMPI.B #2,D0⓪)BEQ okw⓪)CMPI.B #4,D0⓪)BEQ okl⓪)JMP AERR2⓪ okl MOVE #0100100000001000%,D1 ; LINK.L - instruction⓪)MOVE.L DataDest,D0⓪)JSR ApndD0_L⓪)BRA C2⓪ okw MOVE.L DataDest,D0⓪)CMPI.L #$8000,D0⓪)BCS C1⓪)CMPI.L #$FFFF8000,D0⓪)BCC C1⓪)JMP AERR16⓪ C1 JSR ApndD0_W⓪ C2 MOVE.B RegSource,D0⓪)JMP RegTo0_2⓪ END⓪ END MN20;⓪ ⓪ ⓪ (*$ ? Asm20:⓪ ⓪ (*⓪ * %CALLM⓪ *)⓪ PROCEDURE MneCALLM;⓪ BEGIN⓪ ASSEMBLER MOVE.W #1111111111010%,D3⓪)JSR TestTypeSource⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0 ; '#'⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !OK MOVE.L #0111011001000%,D0⓪)JSR CheckModeDest⓪)MOVE.L DataDest,D0⓪)CMPI.L #$100,D0⓪)BCS C1⓪)JMP AERR16⓪ C1 JSR ApndD0_W⓪)JMP DestTo0_5⓪ END⓪ END MneCALLM;⓪ ⓪ *)⓪ ⓪ (*⓪ * %MOVE⓪ *)⓪ PROCEDURE MN21;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeDest,D0⓪)CMPI.B #13,D0 ; D:SR ? ->⓪)BEQ.L MN21G⓪)CMPI.B #15,D0 ; D:CCR ? ->⓪)BEQ.L MN21H⓪)CMPI.B #14,D0 ; D:USP ?⓪)BEQ.L MN21C⓪)MOVE.B ModeSource,D2⓪)CMPI.B #13,D2 ; S: SR ?⓪)BEQ.L MN21A⓪)CMPI.B #15,D2 ; S:CCR ? ->⓪)BEQ.L MN21D⓪)CMPI.B #14,D2 ; S:USP ?⓪)BEQ.L MN21B⓪)⓪)JSR LoadSize⓪)JSR SizeTo12_13 ; D0 bleibt erhalten⓪)⓪)CMPI.B #13,D2⓪)BCC AER1⓪ (*$ ? Gepard:⓪)CMPI.B #2,D2 ; An ?⓪)BNE MN21J⓪)CMPI.B #3,RegSource ; A3 ?⓪)BNE MN21J⓪)MOVE.W #asmIllAM,D2 ; ja-> Warning ausgeben⓪)MOVEQ #1,D3 ; source-Operand⓪)JSR AsmWarning⓪ MN21J⓪ *) JSR SourceTo0_5⓪)⓪)MOVE.B ModeDest,D0⓪)CMPI.B #10,D0⓪)BCC AER1⓪)⓪ (*$ ? Gepard:⓪)CMPI.B #2,D0 ; An ?⓪)BNE MN21K⓪)CMPI.B #3,RegDest ; A3 ?⓪)BNE MN21K⓪)MOVE.W #asmIllAM,D2 ; ja-> Warning ausgeben⓪)MOVEQ #2,D3 ; dest-Operand⓪)JSR AsmWarning⓪ MN21K⓪ *)⓪)MOVE.W D1,D2⓪)CLR.W D1⓪)JSR DestTo0_5⓪)MOVE.W D1,D0⓪)ANDI.W #111000%,D0⓪)ANDI.W #000111%,D1⓪)LSR.W #3,D0⓪)LSL.W #3,D1⓪)OR.W D0,D1⓪)LSL.W #6,D1⓪)OR D2,D1⓪)JSR ApndSource⓪)JMP ApndDest⓪)⓪ AER1 JMP AERR1⓪ ⓪ MN21D ; MOVE CCR,<ea>⓪)MOVE #0100001011000000%,D1⓪)MOVE.L AsmOptions,D0⓪)BTST #24,D0 ; $X+?⓪)BNE MN21E⓪)JMP AERR17 ; 68020-Mne not allowed⓪ MN21A ; MOVE SR,<ea>⓪)MOVE #0100000011000000%,D1⓪ MN21E MOVEQ #2,D0⓪)JSR VerifySize⓪);Size-Bestimmung nicht notwendig, da es⓪);bei Dest. keinen Size-Abh. Operanden gibt⓪)MOVE.B ModeDest,D0⓪)CMPI.B #10,D0⓪)BCC AER1⓪)CMPI.B #2,D0⓪)BEQ AER1⓪)JSR DestTo0_5⓪)JMP ApndDest⓪)⓪ MN21B ; MOVE USP,An⓪)MOVEQ #4,D0⓪)JSR VerifySize⓪)MOVE.B ModeDest,D0⓪)CMPI.B #2,D0⓪)BNE AER1⓪)MOVE.W #$4E68,D1⓪)MOVE.B RegDest,D0⓪)JMP RegTo0_2⓪ ⓪ MN21C ; MOVE An,USP⓪)MOVEQ #4,D0⓪)JSR VerifySize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #2,D0⓪)BNE AER1⓪)MOVE.W #$4E60,D1⓪)MOVE.B RegSource,D0⓪)JMP RegTo0_2⓪)⓪ MN21H MOVE #0100010011000000%,D1 ; MOVE <ea>,CCR⓪)MOVEQ #1,D3 ; CCR : BYTE-Operation(noetig bei '#')⓪)BRA MN21I⓪)⓪ MN21G MOVE #0100011011000000%,D1 ; MOVE <ea>,SR⓪)MOVEQ #2,D3 ; SR : WORD-Operation(noetig bei '#')⓪ MN21I MOVEQ #2,D0⓪)JSR VerifySize⓪)MOVE.B D3,SizeOfData⓪)MOVE.B ModeSource,D0⓪)CMPI.B #13,D0⓪)BCC AER1⓪)CMPI.B #2,D0⓪)BEQ AER1⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END MN21;⓪ ⓪ ⓪ (*⓪ * %MOVEM⓪ *)⓪ PROCEDURE MN22;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #1,D0 ;'.B' nicht erlaubt⓪)BNE OK⓪)JMP AERR2⓪ ⓪ !OK CMPI.B #4,D0 ;Size in Bef-Code eintragen:⓪)BNE MN22F⓪)BSET #6,D1⓪ ⓪ MN22F CMPI.B #18,ModeSource ;Source = REGLIST ?⓪)BEQ MN22A ;ja ->⓪)CMPI.B #12,ModeSource ;teste Source <ea>⓪)BCS OK1 ; ->Source <ea> ist OK⓪ !AER1 JMP AERR1 ;ERROR:Source Adr-Mode nicht erlaubt⓪ ⓪@; MOVEM.X <ea>,Reglist.⓪ !OK1 CMPI.B #18,ModeDest ;ist Dest. = 'Reglist.' ?⓪)BNE AER1 ;Nein ->ERROR⓪)CMPI.B #5,ModeSource ;Source = '-(Ax)' ?⓪)BEQ AER1 ;ja:ERROR⓪)CMPI.B #3,ModeSource ;Source = 'Ax' o. 'Dx' ?⓪)BCS AER1 ;ja:ERROR⓪)BSET #10,D1 ;Direktion-Flag in Bef-Code setzen⓪ MN22E JSR SourceTo0_5 ;<ea> nach Bit 0-5 in Bef-Code⓪)MOVE.W RegListDest,D0 ;Registerliste laden⓪ (*$ ? Gepard:⓪)BTST #8+3,D0 ;A3 drin ?⓪)BEQ MN22E2⓪)MOVE.W #asmIllAM,D2 ;ja-> Warning ausgeben⓪)MOVEQ #2,D3 ;dest-Operand⓪)JSR AsmWarning⓪ MN22E2⓪ *) JSR ApndD0_W⓪)JMP ApndSource⓪ ⓪@; MOVEM.X Reglist.,<ea>⓪ !MN22A CMPI.B #12,ModeDest ;teste Dest.<ea>⓪)BCC AER1 ;ERROR:unerlaubte Dest.<ea>⓪)JSR DestTo0_5 ;<ea> nach Bit 0-5 in Bef-Code⓪)MOVE.W RegListSource,D0 ;Registerliste laden⓪ (*$ ? Gepard:⓪)BTST #8+3,D0 ;A3 drin ?⓪)BEQ MN22A2⓪)MOVE.W #asmIllAM,D2 ;ja-> Warning ausgeben⓪)MOVEQ #1,D3 ;source-Operand⓪)JSR AsmWarning⓪ MN22A2⓪ *) CMPI.B #3,ModeDest ;Dest. = '(Ax)' ?⓪)BEQ MN22B ;ja:OK⓪)CMPI.B #5,ModeDest ;Dest = '-(Ax)' ?⓪)BEQ MN22C ;ja:OK⓪)BCC MN22B ;-> andere erlaubte Adr.-Art⓪)BRA AER1 ; = 'Dx' o. 'Ax' o. '(Ax)+' :ERROR⓪ ⓪ MN22C ;verkehre Reg.liste:⓪)MOVEQ #15,D3⓪ MN22D ROXR.W #1,D0⓪)ROXL.W #1,D2⓪)DBF D3,MN22D⓪)MOVE.W D2,D0⓪ ⓪ MN22B JSR ApndD0_W ; Registerliste als Erw.-Wort zum Code⓪)JMP ApndDest⓪ END⓪ END MN22;⓪ ⓪ ⓪ (*⓪ * %MOVEP⓪ *)⓪ PROCEDURE MN23;⓪ BEGIN⓪ ASSEMBLER JSR LoadSize⓪)CMPI.B #1,D0⓪)BNE OK2⓪)JMP AERR2⓪ !OK2 CMPI.B #2,D0⓪)BEQ MN23A⓪)BSET #6,D1⓪ MN23A BSET #8,D1⓪)MOVE.B ModeSource,D0⓪)CMPI.B #1,D0⓪)BEQ MN23B⓪)CMPI.B #6,D0⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ ⓪ !OK ; MOVEP d16(An),Dn⓪)MOVE.B ModeDest,D0⓪)CMPI.B #1,D0⓪)BNE AER1⓪)MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)JSR ApndSource⓪)MOVE.B RegDest,D0⓪)JMP RegTo9_11⓪ ⓪ MN23B ; MOVEP Dn,d16(An)⓪)MOVE.B ModeDest,D0⓪)CMPI.B #6,D0⓪)BNE AER1⓪)BSET #7,D1⓪)MOVE.B RegSource,D0⓪)JSR RegTo9_11⓪)MOVE.B RegDest,D0⓪)JSR RegTo0_2⓪)JMP ApndDest⓪ END⓪ END MN23;⓪ ⓪ ⓪ (*⓪ * %MOVEQ⓪ *)⓪ PROCEDURE MN24;⓪ BEGIN⓪ ASSEMBLER MOVEQ #4,D0⓪)JSR VerifySize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0⓪)BEQ OK⓪ !AER1 JMP AERR1⓪ !AER2 JMP AERR2⓪ !OK MOVE.B ModeDest,D0⓪)CMPI.B #1,D0⓪)BNE AER1⓪)MOVE.W #1110111000010%,D3⓪)JSR TestTypeDest⓪)MOVE.B RegDest,D0⓪)JSR RegTo9_11⓪)MOVE.L DataSource,D0⓪)CMPI.L #$100,D0⓪)BCS C1⓪)CMPI.L #$FFFFFF80,D0⓪)BHI C1⓪)JMP AERR16⓪ C1 MOVE.B D0,D1⓪ END⓪ END MN24;⓪ ⓪ ⓪ (*⓪ * %Scc, %NBCD, %TAS⓪ *)⓪ PROCEDURE MN25;⓪ BEGIN⓪ ASSEMBLER MOVEQ #1,D0⓪)JSR VerifySize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #10,D0⓪)BCS OK⓪ !AER1 JMP AERR1⓪ !OK CMPI.B #2,D0⓪)BEQ AER1⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)JMP ErrIfOp2⓪ END⓪ END MN25;⓪ ⓪ ⓪ (*⓪ * %STOP, %RTD⓪ *)⓪ PROCEDURE MneSTOP_RTD;⓪ BEGIN⓪ ASSEMBLER MOVE.W #1111111111010%,D3⓪)JSR TestTypeSource⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0⓪)BEQ OK⓪)JMP AERR1⓪ !OK JSR ErrIfSize⓪)MOVE.L DataSource,D0⓪)CMPI.L #$10000,D0⓪)BCS C1⓪)CMPI.L #$FFFF0000,D0⓪)BHI C1⓪)JMP AERR16⓪ C1 JSR ApndD0_W⓪)JMP ErrIfOp2⓪ END⓪ END MneSTOP_RTD;⓪ ⓪ ⓪ (*⓪ * %SWAP⓪ *)⓪ PROCEDURE MN28;⓪ BEGIN⓪ ASSEMBLER MOVEQ #2,D0⓪)JSR VerifySize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #1,D0⓪)BEQ OK⓪)JMP AERR1⓪ !OK MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)JMP ErrIfOp2⓪ END⓪ END MN28;⓪ ⓪ ⓪ PROCEDURE @MN29;⓪ BEGIN⓪ ASSEMBLER CMP.L DataSource,D0⓪)BCC C1⓪)JMP AERR16⓪ C1 OR.L DataSource,D1⓪)JSR ErrIfSize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0⓪)BEQ OK⓪)JMP AERR1⓪ !OK MOVE.W #1111111101010%,D3⓪)JSR TestTypeSource⓪)JMP ErrIfOp2⓪ END⓪ END @MN29;⓪ ⓪ (*⓪ * %TRAP⓪ *)⓪ PROCEDURE MN29;⓪ BEGIN⓪ ASSEMBLER MOVEQ #$10,D0⓪)JMP @mn29⓪ END⓪ END MN29;⓪ ⓪ (*$ ? Asm20:⓪ ⓪ (*⓪ * %BKPT⓪ *)⓪ PROCEDURE MneBKPT;⓪ BEGIN⓪ ASSEMBLER MOVEQ #8,D0⓪)JMP @mn29⓪ END⓪ END MneBKPT;⓪ ⓪ ⓪ (*⓪ * %TRAPcc⓪ *)⓪ PROCEDURE MneTRAPcc;⓪ BEGIN⓪ ASSEMBLER⓪); Für parameterloses TRAPcc muß '()' verwendet werden⓪)CMPI.B #12,modeSource⓪)BEQ hasPara⓪)CMPI.B #7,modeSource ; erw. Adr.-Arten der 68020⓪)BNE AER1⓪)CMPI.B #$80,M20FlgSource⓪)BNE AER1⓪)JSR ErrIfOp2⓪)JSR ErrIfSize⓪)BSET #2,D1⓪)RTS⓪)⓪ hasPara JSR LoadSize⓪)CMPI.B #1,D0⓪)BEQ AER2⓪)BSET #1,D1⓪)CMPI.B #2,D0⓪)BEQ c1⓪)BSET #0,D1⓪ c1 JMP ApndSource⓪ ⓪ AER2 JMP AERR2⓪ AER1 JMP AERR1⓪ END⓪ END MneTRAPcc;⓪ ⓪ *)⓪ ⓪ (*⓪ * %UNLK⓪ *)⓪ PROCEDURE MN30;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #2,D0⓪)BEQ OK⓪)JMP AERR1⓪ !OK MOVE.B RegSource,D0⓪)JSR RegTo0_2⓪)JMP ErrIfOp2⓪ END⓪ END MN30;⓪ ⓪ ⓪ (*⓪ * %MOVEA⓪ *)⓪ PROCEDURE MN32;⓪ BEGIN⓪ ASSEMBLER MOVE.B SizeOfData,D0⓪)CMPI.B #1,D0⓪)BNE OK⓪)JMP AERR2⓪ !OK MOVE.B ModeDest,D0⓪)CMPI.B #2,D0⓪)BEQ OK1⓪)JMP AERR1⓪ !OK1 JMP MN21⓪ END⓪ END MN32;⓪ ⓪ ⓪ (*⓪ * %MOVEC⓪ *)⓪ PROCEDURE MneMOVEC;⓪ BEGIN⓪ ASSEMBLER⓪)MOVEQ #4,D0⓪)JSR VerifySize⓪)CLR D2⓪)⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0⓪)BHI so⓪)⓪)CMPI.B #1,ModeSource⓪)BEQ de1⓪)CMPI.B #2,ModeSource⓪)BEQ de1⓪ AER1 JMP AERR1⓪ de1 MOVE.B RegSource,D2⓪)ROR.W #4,D2⓪)CMPI.B #1,ModeSource⓪)BEQ ok⓪)BSET #15,D2⓪ ok MOVE.B ModeDest,D0⓪)BSET #0,D1⓪)BRA c0⓪)⓪ so CMPI.B #1,ModeDest⓪)BEQ so1⓪)CMPI.B #2,ModeDest⓪)BNE AER1⓪ so1 MOVE.B RegDest,D2⓪)ROR.W #4,D2⓪)CMPI.B #1,ModeDest⓪)BEQ c0⓪)BSET #15,D2⓪ ⓪ c0 CMPI.B #16,D0 ; VBR ?⓪)BNE notVBR⓪)ORI #$801,D2⓪)BRA E0⓪ notVBR CMPI.B #14,D0 ; USP ?⓪)BNE notUSP⓪)ORI #$800,D2⓪)BRA E0⓪ notUSP CMPI.B #19,D0 ; SFC ?⓪)BEQ E0⓪)CMPI.B #22,D0 ; CAAR ?⓪)CMPI.B #20,D0 ; DFC ?⓪)BNE notDFC⓪)ORI #$001,D2⓪)BRA E0⓪ notDFC CMPI.B #22,D0 ; CAAR ?⓪)CMPI.B #21,D0 ; CACR ?⓪)BNE notCACR⓪)ORI #$002,D2⓪)BRA E0⓪ notCACR CMPI.B #22,D0 ; CAAR ?⓪)BNE notCAAR⓪)ORI #$802,D2⓪)BRA E0⓪ notCAAR CMPI.B #23,D0 ; MSP ?⓪)BNE notMSP⓪)ORI #$803,D2⓪)BRA E0⓪ notMSP CMPI.B #24,D0 ; ISP ?⓪)BNE AER1⓪)ORI #$804,D2⓪ ⓪ E0 MOVE.W D2,D0⓪)JMP ApndD0_W⓪ END⓪ END MneMOVEC;⓪ ⓪ ⓪ (*$ ? Asm20:⓪ ⓪ PROCEDURE MneBitFields;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)CLR D2 ; 1. Erw. Wort⓪)BCLR #6,ModeSource⓪)BNE BFSource⓪)⓪)BCLR #6,ModeDest⓪)BNE BFDest⓪)⓪ AER1 JMP AERR1⓪)⓪ ApndBitF OR.B BitWidth,D2⓪)CLR D0⓪)MOVE.B BitOffs,D0⓪)LSL #6,D0⓪)OR D2,D0⓪)JMP ApndD0_W⓪)⓪ BFdest MOVE.B RegSource,D2⓪)ROR #4,D2⓪ c0 JSR DestToLast⓪)BSR ApndBitF⓪)JSR DestTo0_5⓪)JMP ApndDest⓪)⓪ BFsource TST.B ModeDest⓪)BEQ c1⓪)MOVE.B RegDest,D2⓪)ROR #4,D2⓪ c1 JSR SourceToLast⓪)BSR ApndBitF⓪)JSR SourceTo0_5⓪)JMP ApndSource⓪ END⓪ END MneBitFields;⓪ ⓪ ⓪ (*⓪!* %BFCHG, %BFCLR, %BFSET⓪!*)⓪ PROCEDURE MneBitFea;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfOp2⓪)MOVE.L #0001011001010%,D0⓪)JSR CheckModeSource⓪)JMP MneBitFields⓪ END⓪ END MneBitFea;⓪ ⓪ ⓪ (*⓪!* %BFTST⓪!*)⓪ PROCEDURE MneBitFea2;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfOp2⓪)MOVE.L #0111011001010%,D0⓪)JSR CheckModeSource⓪)JMP MneBitFields⓪ END⓪ END MneBitFea2;⓪ ⓪ ⓪ (*⓪ * %BFEXTS %BFEXTU, %BFFFO⓪ *)⓪ PROCEDURE MneBitFea_;⓪ BEGIN⓪ ASSEMBLER CMPI.B #1,ModeDest⓪)BNE AER1⓪)MOVE.L #0111011001010%,D0⓪)JSR CheckModeSource⓪)JMP MneBitFields⓪ AER1 JMP AERR1⓪ END⓪ END MneBitFea_;⓪ ⓪ ⓪ (*⓪ * %BFINS⓪ *)⓪ PROCEDURE MneBitF_ea;⓪ BEGIN⓪ ASSEMBLER CMPI.B #1,ModeSource⓪)BNE AER1⓪)MOVE.L #0001011001010%,D0⓪)JSR CheckModeDest⓪)JMP MneBitFields⓪ AER1 JMP AERR1⓪ END⓪ END MneBitF_ea;⓪ ⓪ ⓪ (*⓪ * %MOVES⓪ *)⓪ PROCEDURE MneMOVES;⓪ BEGIN⓪ ASSEMBLER JMP AERR19⓪ END⓪ END MneMOVES;⓪ ⓪ ⓪ ⓪ (* Beginn der 68881 - Auswertung *)⓪ ⓪ PROCEDURE FLoadSize;⓪ BEGIN⓪ ASSEMBLER MOVE.B SizeOfData,D0⓪)BNE C1⓪)MOVEQ #DefltSiz,D0⓪ C1 MOVE.B D0,SizeOfData⓪ END⓪ END FLoadSize;⓪ ⓪ ⓪ (*⓪!* Anhängen des 68881 op-codes⓪!*)⓪ PROCEDURE ApndZw ;⓪ BEGIN⓪ ASSEMBLER MOVE.L D1,D0⓪)SWAP D0⓪)JMP ApndD0_W⓪ END⓪ END ApndZw ;⓪ ⓪ ⓪ (*⓪!* %RegTo0_2Zw⓪!*)⓪ PROCEDURE RegTo0_2Zw ;⓪ BEGIN⓪ ASSEMBLER ANDI.L #$07,D0⓪)SWAP D0⓪)OR.L D0,D1⓪ END⓪ END RegTo0_2Zw ;⓪ ⓪ ⓪ (*⓪!* %RegTo7_9Zw⓪!*)⓪ PROCEDURE RegTo7_9Zw ;⓪ BEGIN⓪ ASSEMBLER ANDI.L #$07,D0⓪)SWAP D0⓪)LSL.L #7,D0⓪)OR.L D0,D1⓪ END⓪ END RegTo7_9Zw ;⓪ ⓪ ⓪ (*⓪!* %RegTo10_12Zw ;⓪!*)⓪ PROCEDURE RegTo10_12Zw ;⓪ BEGIN⓪ ASSEMBLER ANDI.L #$07,D0⓪)SWAP D0⓪)LSL.L #5,D0⓪)LSL.L #5,D0⓪)OR.L D0,D1⓪ END⓪ END RegTo10_12Zw ;⓪ ⓪ ⓪ (*⓪!* %SizeTo10_12Zw⓪!*)⓪ PROCEDURE SizeTo10_12Zw ;⓪ BEGIN⓪ ASSEMBLER MOVEQ #110%,D0⓪)CMPI.B #$01,SizeOfData⓪)BEQ SizeE⓪)MOVEQ #100%,D0⓪)CMPI.B #$02,SizeOfData⓪)BEQ SizeE⓪)MOVEQ #000%,D0⓪)CMPI.B #$04,SizeOfData⓪)BEQ SizeE⓪)MOVEQ #001%,D0⓪)CMPI.B #$08,SizeOfData⓪)BEQ SizeE⓪)MOVEQ #101%,D0⓪)CMPI.B #$10,SizeOfData⓪)BEQ SizeE⓪)MOVEQ #010%,D0⓪)CMPI.B #$20,SizeOfData⓪)BEQ SizeE⓪)MOVEQ #011%,D0⓪)CMPI.B #$40,SizeOfData⓪)BEQ SizeE⓪)JMP AERR1⓪ SizeE ANDI.L #$07,D0⓪)SWAP D0⓪)LSL.L #5,D0⓪)LSL.L #5,D0⓪)OR.L D0,D1⓪ END⓪ END SizeTo10_12Zw ;⓪ ⓪ ⓪ (*⓪!* %FMOVECR⓪!*)⓪ PROCEDURE MneFMoveCr ;⓪ BEGIN⓪ ASSEMBLER MOVEQ #$20,D0⓪)JSR VerifySize⓪)CMPI.B #12,ModeSource⓪)BEQ SOK⓪ AER1 JMP AERR1⓪ SOK CMPI.B #25,ModeDest⓪)BNE AER1⓪)MOVE.W #1111111101010%,D3⓪)JSR TestTypeSource⓪)MOVE.L DataSource,D0⓪)CMPI.L #$80,D0⓪)BCS OK⓪)JMP AERR2⓪ OK SWAP D0⓪)OR.L D0,D1⓪)MOVE.B RegDest,D0⓪)JSR RegTo7_9Zw⓪)JMP ApndZw⓪ END⓪ END MneFMoveCr ;⓪ ⓪'⓪ (*⓪!* Ausführen einer <ea>⓪!*)⓪ PROCEDURE ProcessEA ;⓪ BEGIN⓪ ASSEMBLER JSR ApndZw⓪)JSR VerifyEA⓪)JSR EATo0_5⓪)JMP ApndEA⓪ END⓪ END ProcessEA ;⓪ ⓪ ⓪ (*⓪!* Append <fea>⓪!*)⓪ PROCEDURE Apndfea ;⓪ BEGIN⓪ ASSEMBLER CMPI.B #25,Mode⓪)BEQ REGREGOP⓪)BSET #30,D1⓪)JSR FLoadSize⓪)CMPI.B #02,Mode⓪)BNE MOK⓪ AER1 JMP AERR1⓪ AER2 JMP AERR2⓪ MOK BCC SOK⓪)MOVE.B SizeOfData,D0⓪)ANDI.B #00001111%,D0⓪)BEQ AER2⓪ SOK JSR SizeTo10_12Zw⓪)JMP ProcessEA⓪ REGREGOP MOVEQ #$20,D0⓪)JSR VerifySize⓪)MOVE.B Reg,D0⓪)JSR RegTo10_12Zw⓪)JMP ApndZw⓪ END⓪ END Apndfea ;⓪ ⓪ ⓪ (*⓪!* Verbiten von ..PC und #..⓪!*)⓪ PROCEDURE ErrOnImOrPc ;⓪ BEGIN⓪ ASSEMBLER CMPI.B #10,Mode⓪)BCS OK⓪)JMP AERR1⓪ OK⓪ END⓪ END ErrOnImOrPc ;⓪ ⓪ ⓪ (*⓪!* Eintragen von FPm ÕÕœ FPn oder <EA> ÕÕœ FPn⓪!*)⓪ PROCEDURE TrasferToFPn ;⓪ BEGIN⓪ ASSEMBLER CMPI.B #25,ModeDest⓪)BEQ SOK⓪)JMP AERR1⓪ SOK MOVE.B RegDest,D0⓪)JSR RegTo7_9Zw⓪)JSR SourceToLast⓪)JMP Apndfea⓪ END⓪ END TrasferToFPn ;⓪ ⓪ ⓪ (*⓪!* %FMOVEM⓪!*)⓪ PROCEDURE MneFMoveM ;⓪ BEGIN⓪ ASSEMBLER CMPI.B #26,ModeDest⓪)BEQ MnToFPnS⓪)CMPI.B #26,ModeSource⓪)BEQ MnFrFPnS⓪)CMPI.B #01,ModeDest⓪)BEQ.L MnToFPnD⓪)CMPI.B #01,ModeSource⓪)BEQ.L MnFrFPnD⓪)CMPI.B #28,ModeDest⓪)BEQ.L MnToFPcr⓪)CMPI.B #28,ModeSource⓪)BEQ.L MnFrFPcr⓪ AER1 JMP AERR1⓪ ToMem JSR DestToLast⓪)CMPI.B #10,Mode⓪)BCC AER1⓪)CMPI.B #04,Mode⓪)BEQ AER1⓪)BSET #29,D1⓪)RTS⓪ FromMem JSR SourceToLast⓪)CMPI.B #05,Mode⓪)BEQ AER1⓪)RTS⓪ MnToFPnS BSR FromMem⓪)MOVE.W RegListDest,D0⓪)BRA MnMFPnS⓪ MnFrFPnS BSR ToMem⓪)MOVE.W RegListSource,D0⓪ MnMFPnS CMPI.B #05,Mode⓪)BEQ ListOk⓪)MOVEQ #7,D3⓪ REP ROXR.B #1,D0⓪)ROXL.B #1,D2⓪)DBF D3,REP⓪)MOVE.B D2,D0⓪)BSET #28,D1⓪ ListOk ANDI.L #$FF,D0⓪)SWAP D0⓪)OR.L D0,D1⓪)BRA MnMFPn⓪ MnToFPnD BSR FromMem⓪)MOVE.B RegDest,D0⓪)BRA MnMFPnD⓪ MnFrFPnD BSR ToMem⓪)MOVE.B RegSource,D0⓪ MnMFPnD CMPI.B #05,Mode⓪)BEQ DirOk⓪)BSET #28,D1⓪ DirOk ANDI.L #$7,D0⓪)LSL.W #4,D0⓪)SWAP D0⓪)OR.L D0,D1⓪)BSET #27,D1⓪ MnMFPn CMPI.B #02,Mode⓪)BLS AER1H⓪)CMPI.B #12,Mode⓪)BCC AER1H⓪)MOVEQ #$20,D0⓪)JSR VerifySize⓪)MOVE.B D0,SizeOfData⓪)BSET #30,D1⓪)JMP ProcessEA⓪ AER1H BRA.L AER1⓪ MnToFPcr JSR SourceToLast⓪)MOVE.W RegListDest,D0⓪)BRA MnMFPcr⓪ MnFrFPcr JSR DestToLast⓪)CMPI.B #10,Mode⓪)BCC AER1H⓪)BSET #29,D1⓪)MOVE.W RegListSource,D0⓪ MnMFPcr ANDI.L #7,D0⓪)LSL.W #5,D0⓪)LSL.W #5,D0⓪)SWAP D0⓪)OR.L D0,D1⓪)CMPI.B #02,Mode⓪)BLS AER1H⓪)CMPI.B #12,Mode⓪)BCC AER1H⓪)MOVEQ #$04,D0⓪)JSR VerifySize⓪)MOVE.B D0,SizeOfData⓪)JMP ProcessEA⓪ END⓪ END MneFMoveM ;⓪ ⓪'⓪ (*⓪!* %FMOVE⓪!*)⓪ PROCEDURE MneFMove ;⓪ BEGIN⓪ ASSEMBLER CMPI.B #25,ModeDest⓪)BEQ MnToFPn⓪)CMPI.B #25,ModeSource⓪)BNE MnMCCr⓪)CMPI.B #29,ModeDest⓪)BEQ MnFrFPn2⓪)CMPI.B #30,ModeDest⓪)BEQ MnFrFPn3⓪)BRA MnFrFPn1⓪ MnMCCr CMPI.B #27,ModeDest⓪)BEQ.L MnToFPcr⓪)CMPI.B #27,ModeSource⓪)BEQ.L MnFrFPcr⓪ AER1 JMP AERR1⓪ AER2 JMP AERR2⓪ MnToFPn JMP TrasferToFPn⓪ MnFrFPn3 MOVE.B FormatDest,D0⓪)BRA MnFrFpnP⓪ MnFrFPn2 BSET #28,D1⓪)MOVE.B FormatDest,D0⓪)LSL.B #4,D0⓪ MnFrFPnP ANDI.L #$7F,D0⓪)SWAP D0⓪)OR.L D0,D1⓪)CMPI.B #$40,SizeOfData⓪)BNE AER1⓪)MOVE.B Mode2Dest,ModeDest⓪)BRA MnFrFPn⓪ MnFrFPn1 CMPI.B #$40,SizeOfData⓪)BEQ AER1⓪ MnFrFPn BSET #29,D1⓪)MOVE.B RegSource,D0⓪)JSR RegTo7_9Zw⓪)JSR DestToLast⓪)JSR ErrOnImOrPc⓪)JMP Apndfea⓪ MnToFPcr JSR SourceToLast⓪)MOVE.B RegDest,D0⓪)BRA MnMFPcr⓪ MnFrFPcr JSR DestToLast⓪)JSR ErrOnImOrPc⓪)MOVE.B RegSource,D0⓪)BSET #29,D1⓪ MnMFPcr ADDI.B #26,D0⓪)BSET D0,D1⓪)MOVE.B Mode,D2⓪)CMPI.B #02,D2⓪)BNE MnAMOk⓪)CMPI.B #26,D0⓪)BEQ MnAMOk⓪)JMP AERR1⓪ MnAMOk BSET #31,D1⓪)MOVEQ #4,D0⓪)JSR VerifySize⓪)MOVE.B D0,SizeOfData⓪)JMP ProcessEA⓪ END⓪ END MneFMove ;⓪ ⓪'⓪ (*⓪!* %FADD, %FCMP, %FDIV, %FMOD, %FMUL, %FREM, %FSCALE, %FSGLDIV, %FSGLMUL,⓪!* %FSUB⓪!*)⓪ PROCEDURE MneDyOp ;⓪ BEGIN⓪ ASSEMBLER JMP TrasferToFPn⓪ END⓪ END MneDyOp ;⓪ ⓪'⓪ (*⓪!* %FTST⓪!*)⓪ PROCEDURE MneFTst ;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfOp2⓪)JSR SourceToLast⓪)JMP Apndfea⓪ END⓪ END MneFTst ;⓪ ⓪'⓪ (*⓪!* %FABS, %FACOS, %FASIN, %FATAN, %FATANH, %FCOS, %FCOSH, %FETOX, %FETOXM1,⓪!* %FGETEXP, %FGETMAN, %FINT, %FINTRZ, %FLOGN, %FLOGNP1, %FLOG10, %FLOG2,⓪!* %FNEG, %FSIN, %FSINH, %FSQRT, %FTAN, %FTANH, %FTENTOX, %FTWOTOX⓪!*)⓪ PROCEDURE MneMoOp ;⓪ BEGIN⓪ ASSEMBLER Tst.W ModeDest⓪)BNE ToOpSpez⓪)JSR SourceToLast⓪)JSR LastToDest⓪ ToOpSpez JMP TrasferToFPn⓪ END⓪ END MneMoOp ;⓪ ⓪'⓪ (*⓪!* %FSINCOS⓪!*)⓪ PROCEDURE MneDualMoOp ;⓪ BEGIN⓪ ASSEMBLER CMPI.B #$80+25,ModeDest⓪)BEQ SOK⓪ AER1 JMP AERR1⓪ SOK BCLR #7,ModeDest⓪)CMPI.B #25,Mode2Dest⓪)BNE AER1⓪)MOVE.B RegDest,D0⓪)CMP.B Reg2Dest,D0⓪)BEQ AER1⓪)JSR RegTo0_2Zw⓪)MOVE.B Reg2Dest,RegDest⓪)JMP TrasferToFPn⓪ END⓪ END MneDualMoOp ;⓪ ⓪ ⓪ (*⓪!* %FSAVE⓪!*)⓪ PROCEDURE MneFSave ;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #10,D0⓪)BCS OK⓪ !AER1 JMP AERR1⓪ !OK CMPI.B #2,D0⓪)BLS AER1⓪)CMPI.B #4,D0⓪)BEQ AER1⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)JMP ErrIfOp2⓪ END⓪ END MneFSave ;⓪ ⓪'⓪ (*⓪!* %FRESTORE⓪!*)⓪ PROCEDURE MneFRes ;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfSize⓪)MOVE.B ModeSource,D0⓪)CMPI.B #12,D0⓪)BCS OK⓪ !AER1 JMP AERR1⓪ !OK CMPI.B #2,D0⓪)BLS AER1⓪)CMPI.B #5,D0⓪)BEQ AER1⓪)JSR SourceTo0_5⓪)JSR ApndSource⓪)JMP ErrIfOp2⓪ END⓪ END MneFRes ;⓪ ⓪'⓪ (*⓪!* %FScc⓪!*)⓪ PROCEDURE MneFScc ;⓪ BEGIN⓪ ASSEMBLER JSR ApndZw⓪)JMP MN25⓪ END⓪ END MneFScc ;⓪ ⓪'⓪ (*⓪!* %FTRAPcc⓪!*)⓪ PROCEDURE MneFTRAPcc ;⓪ BEGIN⓪ ASSEMBLER⓪)JSR ApndZw⓪)JMP MneTRAPcc⓪ END⓪ END MneFTRAPcc ;⓪ ⓪'⓪ (*⓪!* %FBcc⓪!*)⓪ PROCEDURE MneFBcc;⓪ BEGIN⓪ ASSEMBLER JSR ErrIfOp2⓪)MOVEQ #2,D0⓪)JSR VerifySize⓪)MOVE.B D0,SizeOfData ; '.W' als Default⓪)JSR SourceToLast⓪)JMP @MN7A⓪ END⓪ END MneFBcc;⓪ ⓪ ⓪ (*⓪!* %FDBcc⓪!*)⓪ PROCEDURE MneFDBcc;⓪ BEGIN⓪ ASSEMBLER MOVE.B ModeSource,D0⓪)CMPI.B #1,D0 ;Source = 'Dn' ?⓪)BEQ OK⓪)JMP AERR1 ;nein:ERROR⓪ !OK MOVEQ #2,D0⓪)JSR VerifySize⓪)MOVE.B D0,SizeOfData ; '.W' als Default⓪)JSR ApndZw⓪)MOVE.B RegSource,D0⓪)JSR RegTo0_2 ;setze Reg. in Code-Wort⓪)JSR DestToLast⓪)JMP @MN7A⓪ END⓪ END MneFDBcc;⓪ ⓪ (* Ende Gepard-Conditional *) *)⓪ ⓪ PROCEDURE MneJmpTab;⓪ BEGIN⓪ ASSEMBLER⓪)DC.L MN0⓪)DC.L MN0⓪)DC.L MN31⓪)DC.L MN31⓪)DC.L MN1 ;%ADD⓪)DC.L MN1 ;%AND⓪)DC.L MN1 ;%OR⓪)DC.L MN1 ;%SUB⓪)DC.L MN2 ;%ADDA⓪)DC.L MN2 ;%CMPA⓪)DC.L MN2 ;%SUBA⓪)DC.L MN32 ;%MOVEA⓪)DC.L MN3 ;%ADDI⓪)DC.L MN3 ;%CMPI⓪)DC.L MN3 ;%SUBI⓪)DC.L MN4 ;%ANDI⓪)DC.L MN4 ;%EORI⓪)DC.L MN4 ;%ORI⓪)DC.L MN5 ;%ADDQ⓪)DC.L MN5 ;%SUBQ⓪)DC.L MN6 ;%ASL⓪)DC.L MN6 ;%ASR⓪)DC.L MN6 ;%LSL⓪)DC.L MN6 ;%LSR⓪)DC.L MN6 ;%ROL⓪)DC.L MN6 ;%ROR⓪)DC.L MN6 ;%ROXL⓪)DC.L MN6 ;%ROXR⓪)DC.L MN7 ;%BCC %Bcc⓪)DC.L MN7 ;%BCS⓪)DC.L MN7 ;%BEQ⓪)DC.L MN7 ;%BGE⓪)DC.L MN7 ;%BGT⓪)DC.L MN7 ;%BHI⓪)DC.L MN7 ;%BLE⓪)DC.L MN7 ;%BLS⓪)DC.L MN7 ;%BLT⓪)DC.L MN7 ;%BMI⓪)DC.L MN7 ;%BNE⓪)DC.L MN7 ;%BPL⓪)DC.L MN7 ;%BVC⓪)DC.L MN7 ;%BVS⓪)DC.L MN7 ;%BRA⓪)DC.L MN7 ;%BSR⓪)DC.L MN8 ;%BCHG⓪)DC.L MN8 ;%BCLR⓪)DC.L MN8 ;%BSET⓪)DC.L MN9 ;%BTST⓪)DC.L MneCHK ;%CHK⓪)DC.L MN10 ;%MULS⓪)DC.L MN10 ;%MULU⓪)DC.L MN10 ;%DIVS⓪)DC.L MN10 ;%DIVU⓪)DC.L MN11 ;%CLR⓪)DC.L MN11 ;%NEG⓪)DC.L MN11 ;%NEGX⓪)DC.L MN11 ;%NOT⓪)DC.L MneTST ;%TST⓪)DC.L MN12 ;%CMP⓪)DC.L MN13 ;%CMPM⓪)DC.L MN14 ; %DBcc⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN14⓪)DC.L MN15 ;%EOR⓪)DC.L MN16 ;%EXG⓪)DC.L MneEXT ;%EXT⓪)DC.L MN18 ;%JMP⓪)DC.L MN18 ;%JSR⓪)DC.L MN18P ;%PEA⓪)DC.L MN19 ;%LEA⓪)DC.L MN20 ;%LINK⓪)DC.L MN21 ;%MOVE⓪)DC.L MN22 ;%MOVEM⓪)DC.L MN23 ;%MOVEP⓪)DC.L MN24 ;%MOVEQ⓪)DC.L MN25 ;%NBCD⓪)DC.L MN25 ;%SCC %Scc⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25⓪)DC.L MN25 ;%TAS⓪)DC.L NoOperands ;%NOP⓪)DC.L NoOperands ;%RTE⓪)DC.L NoOperands ;%RTS⓪)DC.L NoOperands ;%TRAPV⓪)DC.L NoOperands ;%RESET⓪)DC.L MneSTOP_RTD ;%STOP⓪)DC.L MN28 ;%SWAP⓪)DC.L MN29 ;%TRAP⓪)DC.L MN30 ;%UNLK⓪)DC.L NoOperands ;%RTR⓪)DC.L MN14 ;%DBRA⓪)DC.L NoOperands ;%ILLEGAL⓪)DC.L NoOperands ;%BREAK⓪)DC.L MneMOVEC ;%MOVEC⓪)DC.L MneSTOP_RTD ;%RTD⓪ (*$ ? Asm20:⓪); Erweiterungen seit 3.3a / 1.8.86 f. 68020⓪)DC.L MneBitFea ;%BFCHG⓪)DC.L MneBitFea ;%BFCLR⓪)DC.L MneBitFea_ ;%BFEXTS⓪)DC.L MneBitFea_ ;%BFEXTU⓪)DC.L MneBitFea_ ;%BFFFO⓪)DC.L MneBitF_ea ;%BFINS⓪)DC.L MneBitFea ;%BFSET⓪)DC.L MneBitFea2 ;%BFTST⓪)DC.L MneBKPT ;%BKPT⓪)DC.L MneCALLM ;%CALLM⓪)DC.L MneCAS ;%CAS⓪)DC.L MneCAS2 ;%CAS2⓪)DC.L MneCHK2_CMP2 ;%CHK2⓪)DC.L MneCHK2_CMP2 ;%CMP2⓪)DC.L MneDIVSL_UL ;%DIVSL⓪)DC.L MneDIVSL_UL ;%DIVUL⓪)DC.L MneEXT ;%EXTB⓪)DC.L MneMOVES ;%MOVES⓪)DC.L MnePACK_UNPK ;%PACK⓪)DC.L MneRTM ;%RTM⓪)DC.L MneTRAPcc ;%TRAPCC⓪)DC.L MneTRAPcc ;%TRAPCS⓪)DC.L MneTRAPcc ;%TRAPEQ⓪)DC.L MneTRAPcc ;%TRAPF⓪)DC.L MneTRAPcc ;%TRAPGE⓪)DC.L MneTRAPcc ;%TRAPGT⓪)DC.L MneTRAPcc ;%TRAPHI⓪)DC.L MneTRAPcc ;%TRAPLE⓪)DC.L MneTRAPcc ;%TRAPLS⓪)DC.L MneTRAPcc ;%TRAPLT⓪)DC.L MneTRAPcc ;%TRAPMI⓪)DC.L MneTRAPcc ;%TRAPNE⓪)DC.L MneTRAPcc ;%TRAPPL⓪)DC.L MneTRAPcc ;%TRAPT⓪)DC.L MneTRAPcc ;%TRAPVC⓪)DC.L MneTRAPcc ;%TRAPVS⓪)DC.L MnePACK_UNPK ;%UNPK⓪)⓪); Erweiterung für 68881⓪)DC.L MneFMove ;%FMOVE ; Umspeichern⓪)DC.L MneFMoveCr ;%FMOVECR⓪)DC.L MneFMoveM ;%FMOVEM⓪)DC.L MneFRes ;%FRESTORE⓪)DC.L MneFSave ;%FSAVE⓪)DC.L NoOperandsWZE ;%FNOP⓪)DC.L MneFTst ;%FTST⓪)DC.L MneFBcc ;%FBEQ ; Controls⓪)DC.L MneFBcc ;%FBF⓪)DC.L MneFBcc ;%FBGE⓪)DC.L MneFBcc ;%FBGL⓪)DC.L MneFBcc ;%FBGLE⓪)DC.L MneFBcc ;%FBGT⓪)DC.L MneFBcc ;%FBLE⓪)DC.L MneFBcc ;%FBLT⓪)DC.L MneFBcc ;%FBNE⓪)DC.L MneFBcc ;%FBNGE⓪)DC.L MneFBcc ;%FBNGL⓪)DC.L MneFBcc ;%FBNGLE⓪)DC.L MneFBcc ;%FBNGT⓪)DC.L MneFBcc ;%FBNLE⓪)DC.L MneFBcc ;%FBNLT⓪)DC.L MneFBcc ;%FBSEQ⓪)DC.L MneFBcc ;%FBSF⓪)DC.L MneFBcc ;%FBSNE⓪)DC.L MneFBcc ;%FBST⓪)DC.L MneFBcc ;%FBOGE⓪)DC.L MneFBcc ;%FBOGL⓪)DC.L MneFBcc ;%FBOGT⓪)DC.L MneFBcc ;%FBOLE⓪)DC.L MneFBcc ;%FBOLT⓪)DC.L MneFBcc ;%FBOR⓪)DC.L MneFBcc ;%FBT⓪)DC.L MneFBcc ;%FBUGE⓪)DC.L MneFBcc ;%FBUEQ⓪)DC.L MneFBcc ;%FBUN⓪)DC.L MneFBcc ;%FBUGT⓪)DC.L MneFBcc ;%FBULE⓪)DC.L MneFBcc ;%FBULT⓪)DC.L MneFDBcc ;%FDBEQ⓪)DC.L MneFDBcc ;%FDBF⓪)DC.L MneFDBcc ;%FDBGE⓪)DC.L MneFDBcc ;%FDBGL⓪)DC.L MneFDBcc ;%FDBGLE⓪)DC.L MneFDBcc ;%FDBGT⓪)DC.L MneFDBcc ;%FDBLE⓪)DC.L MneFDBcc ;%FDBLT⓪)DC.L MneFDBcc ;%FDBNE⓪)DC.L MneFDBcc ;%FDBNGE⓪)DC.L MneFDBcc ;%FDBNGL⓪)DC.L MneFDBcc ;%FDBNGLE⓪)DC.L MneFDBcc ;%FDBNGT⓪)DC.L MneFDBcc ;%FDBNLE⓪)DC.L MneFDBcc ;%FDBNLT⓪)DC.L MneFDBcc ;%FDBSEQ⓪)DC.L MneFDBcc ;%FDBSF⓪)DC.L MneFDBcc ;%FDBSNE⓪)DC.L MneFDBcc ;%FDBST⓪)DC.L MneFDBcc ;%FDBOGE⓪)DC.L MneFDBcc ;%FDBOGL⓪)DC.L MneFDBcc ;%FDBOGT⓪)DC.L MneFDBcc ;%FDBOLE⓪)DC.L MneFDBcc ;%FDBOLT⓪)DC.L MneFDBcc ;%FDBOR⓪)DC.L MneFDBcc ;%FDBT⓪)DC.L MneFDBcc ;%FDBUGE⓪)DC.L MneFDBcc ;%FDBUEQ⓪)DC.L MneFDBcc ;%FDBUN⓪)DC.L MneFDBcc ;%FDBUGT⓪)DC.L MneFDBcc ;%FDBULE⓪)DC.L MneFDBcc ;%FDBULT⓪)DC.L MneFScc ;%FSEQ⓪)DC.L MneFScc ;%FSF⓪)DC.L MneFScc ;%FSGE⓪)DC.L MneFScc ;%FSGL⓪)DC.L MneFScc ;%FSGLE⓪)DC.L MneFScc ;%FSGT⓪)DC.L MneFScc ;%FSLE⓪)DC.L MneFScc ;%FSLT⓪)DC.L MneFScc ;%FSNE⓪)DC.L MneFScc ;%FSNGE⓪)DC.L MneFScc ;%FSNGL⓪)DC.L MneFScc ;%FSNGLE⓪)DC.L MneFScc ;%FSNGT⓪)DC.L MneFScc ;%FSNLE⓪)DC.L MneFScc ;%FSNLT⓪)DC.L MneFScc ;%FSSEQ⓪)DC.L MneFScc ;%FSSF⓪)DC.L MneFScc ;%FSSNE⓪)DC.L MneFScc ;%FSST⓪)DC.L MneFScc ;%FSOGE⓪)DC.L MneFScc ;%FSOGL⓪)DC.L MneFScc ;%FSOGT⓪)DC.L MneFScc ;%FSOLE⓪)DC.L MneFScc ;%FSOLT⓪)DC.L MneFScc ;%FSOR⓪)DC.L MneFScc ;%FST⓪)DC.L MneFScc ;%FSUGE⓪)DC.L MneFScc ;%FSUEQ⓪)DC.L MneFScc ;%FSUN⓪)DC.L MneFScc ;%FSUGT⓪)DC.L MneFScc ;%FSULE⓪)DC.L MneFScc ;%FSULT⓪)DC.L MneFTRAPcc ;%FTRAPEQ⓪)DC.L MneFTRAPcc ;%FTRAPF⓪)DC.L MneFTRAPcc ;%FTRAPGE⓪)DC.L MneFTRAPcc ;%FTRAPGL⓪)DC.L MneFTRAPcc ;%FTRAPGLE⓪)DC.L MneFTRAPcc ;%FTRAPGT⓪)DC.L MneFTRAPcc ;%FTRAPLE⓪)DC.L MneFTRAPcc ;%FTRAPLT⓪)DC.L MneFTRAPcc ;%FTRAPNE⓪)DC.L MneFTRAPcc ;%FTRAPNGE⓪)DC.L MneFTRAPcc ;%FTRAPNGL⓪)DC.L MneFTRAPcc ;%FTRAPNGLE⓪)DC.L MneFTRAPcc ;%FTRAPNGT⓪)DC.L MneFTRAPcc ;%FTRAPNLE⓪)DC.L MneFTRAPcc ;%FTRAPNLT⓪)DC.L MneFTRAPcc ;%FTRAPSEQ⓪)DC.L MneFTRAPcc ;%FTRAPSF⓪)DC.L MneFTRAPcc ;%FTRAPSNE⓪)DC.L MneFTRAPcc ;%FTRAPST⓪)DC.L MneFTRAPcc ;%FTRAPOGE⓪)DC.L MneFTRAPcc ;%FTRAPOGL⓪)DC.L MneFTRAPcc ;%FTRAPOGT⓪)DC.L MneFTRAPcc ;%FTRAPOLE⓪)DC.L MneFTRAPcc ;%FTRAPOLT⓪)DC.L MneFTRAPcc ;%FTRAPOR⓪)DC.L MneFTRAPcc ;%FTRAPT⓪)DC.L MneFTRAPcc ;%FTRAPUGE⓪)DC.L MneFTRAPcc ;%FTRAPUEQ⓪)DC.L MneFTRAPcc ;%FTRAPUN⓪)DC.L MneFTRAPcc ;%FTRAPUGT⓪)DC.L MneFTRAPcc ;%FTRAPULE⓪)DC.L MneFTRAPcc ;%FTRAPULT⓪)DC.L MneDyOp ;%FADD ; Dyadic Operations⓪)DC.L MneDyOp ;%FCMP⓪)DC.L MneDyOp ;%FDIV⓪)DC.L MneDyOp ;%FMOD⓪)DC.L MneDyOp ;%FMUL⓪)DC.L MneDyOp ;%FREM⓪)DC.L MneDyOp ;%FSCALE⓪)DC.L MneDyOp ;%FSGLDIV⓪)DC.L MneDyOp ;%FSGLMUL⓪)DC.L MneDyOp ;%FSUB⓪)DC.L MneMoOp ;%FABS ; Monidic Operations⓪)DC.L MneMoOp ;%FACOS⓪)DC.L MneMoOp ;%FASIN⓪)DC.L MneMoOp ;%FATAN⓪)DC.L MneMoOp ;%FATANH⓪)DC.L MneMoOp ;%FCOS⓪)DC.L MneMoOp ;%FCOSH⓪)DC.L MneMoOp ;%FETOX⓪)DC.L MneMoOp ;%FETOXM1⓪)DC.L MneMoOp ;%FGETEXP⓪)DC.L MneMoOp ;%FGETMAN⓪)DC.L MneMoOp ;%FINT⓪)DC.L MneMoOp ;%FINTRZ⓪)DC.L MneMoOp ;%FLOGN⓪)DC.L MneMoOp ;%FLOGNP1⓪)DC.L MneMoOp ;%FLOG10⓪)DC.L MneMoOp ;%FLOG2⓪)DC.L MneMoOp ;%FNEG⓪)DC.L MneMoOp ;%FSIN⓪)DC.L MneMoOp ;%FSINH⓪)DC.L MneMoOp ;%FSQRT⓪)DC.L MneMoOp ;%FTAN⓪)DC.L MneMoOp ;%FTANH⓪)DC.L MneMoOp ;%FTENTOX⓪)DC.L MneMoOp ;%FTWOTOX⓪)DC.L MneDualMoOp ;%FSINCOS ; Dual Monadic Operation⓪ *)⓪ END⓪ END MneJmpTab;⓪ ə
- (* $000082EC$00010C48$00010CCD$00010D53$0002194C$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$00008F25$FFFCB948$00017E98$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$0001E2F9$0000899F$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948$FFFCB948Ç$0001217AT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00008F35$00008F99$000121F8$000228EF$0001212B$0001219D$0001217A$00012197$0001214A$00020855$00020876$000208AE$00020894$00020870$00001D59$00001D83ñÇâ*)
-